由于依赖关系未解决,无法使用Winforms控件

问题描述 投票:0回答:8

问题:我有一个 WinForms 控件(“MyControl”),它依赖于 myCli.dll,这是一个用 C++ CLI 编写的 dll。该组件是第三方的(由另一个团队编写)。 myCli.dll 依赖于由另一方编写的 myLibrary.dll。该控件位于 myAssembly.dll 中,这是一个 C# 控件和资源库。

当 myCli.dll 不依赖于 myLibrary.dll 时,这个控件工作得很好。我可以将它添加到表单中、构建它等等。但新版本的 myCli.dll 出现了,我重新链接了它。突然间,IDE 表现不佳。关键问题似乎是 IDE 无法解决 myCli.dll 对 myLibrary.dll 的依赖关系。

当我尝试将控件从工具箱拖动到设计图面时,出现错误:

"Failed to create component 'MyControl'.  

错误消息如下:

'System.IO.FileNotFoundException: Could not load file or assembly 'myCli.dll, Version 0.0.0.0, Culture=neutral, PublicKeyToken=2fb8da784abc560a' or one of its dependencies. 
The system cannot find the file specified"

我的信念是,如果我能弄清楚将 myLibrary.dll 放在哪里,我就能解决引用问题。我不确定这一点。有人知道我应该做什么来解决这个问题吗?

c# .net winforms user-controls controls
8个回答
1
投票

就我而言,我的 Initialize 和 Form_Load 代码包含对另一个项目的调用,具体取决于 DLL 引用。通过使用

排除此代码
if (!DesignMode)
{
    //add your initializing code (for runtime!) here
}

我能够在设计时添加控件。

HTH


0
投票

我认为DLL需要进入项目目录,然后将其设置为在构建时复制到输出目录。


0
投票

为了设计师的支持,我认为

myLibrary.dll
必须进入
C:\Program Files\Visual Studio xxx\Common7\IDE\PublicAssemblies
(假设
myCLI.dll
也在那里),或者到
myCLI.dll
存在的地方,或者你可以尝试将它复制到
C:\Windows\System32
-系统应该能够找到它。

确保将其添加到项目中,并将其设置为“始终复制”,如 Clippit '98 的建议。


0
投票

找到正确位置的另一种方法可能是使用Process Monitor。只需过滤 dll 的输出并检查它在哪些路径中搜索该文件即可。


0
投票

myCli.dll 及其所有依赖项需要位于完全相同的文件夹中,否则 VS 将无法找到它们。

最简单的方法是确保在构建 myCli.dll 时,将所有文件复制到 Debug/Release 文件夹,然后直接从 Debug/Release 文件夹引用项目中的这些控件。


0
投票

我知道这是一个旧线程,但只是补充一下我用来解决我的确切问题的内容。

我最初使用了Peter Rakké在这个问题中的解决方案(https://stackoverflow.com/a/15077337/34440)。但这不是理想的,因为它迫使我改变了通常的模式。

由于我的 C++/CLI 在执行时仅使用本机 dll 中的函数并包含其自己的接口信息,因此我只是将本机 dll 更改为延迟加载。我在 Visual Studio 的项目设置下添加了两个本机 dll(项目属性 -> 配置属性 -> 链接器 -> 输入 -> 延迟加载的 Dlls)。确保将属性对话框顶部的“配置”和“平台”下拉列表设置为“全部”选项,并进行完整的重建。

然后我可以在嵌套控件和表单中引用 C++/CLI DLL 中的类型。


0
投票

与MedicineMan的情况相同。 WinForms 项目在libraryA.dll 中使用2 个不同的组件,而libraryA.dll 又依赖于libraryB.dll。

对我有用的解决方案(只需在所有项目中引用适用的 DLL,即使所有库都是在调试模式下构建的,并且无需手动将 DLL 复制到不同的文件夹):

  1. 对于libraryA.dll中覆盖绘制事件的组件,如果处于DesignTime模式则退出:

    If Me.DesignMode Then Exit Sub
    
  2. 对于libraryA.dll中具有使用libraryB.dll中的类型的公共属性的组件,使用属性向设计器隐藏这些属性(仔细检查语法 - 我已经看到其他几篇文章有一些奇怪的拼写/变体):

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    
  3. 重新构建组件,然后重新启动 Visual Studio,然后再在 WinForms 项目中使用。由于某种原因,在同一会话期间未检测到属性的更改,并且在尝试明显的操作之前我又花了几个小时。

如果您仍然遇到问题,有一篇关于在组件绑定期间(即当您将组件拖放到表单上时)获取调试信息的优秀文章:如何在 .NET 中启用程序集绑定失败日志记录(Fusion)(向下滚动到迈克·戈特利 (Mike Goatly) 的回答)。

祝你好运。


0
投票

我的问题是,控制 DLL 引用的两个 DLL 不知何故丢失了它们的 AssemblyInfo.cs 文件,因此 VS 尝试查找版本 0.0.0.0,因为该版本未设置。通过选择项目属性 -> 应用程序 -> 程序集信息...并在版本字段中输入 1.0.0.0 最终解决了问题。该文件已重新生成并放置到位。编译并摇滚。

© www.soinside.com 2019 - 2024. All rights reserved.