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

Posted

技术标签:

【中文标题】由于未解决的依赖关系,无法使用 Winforms 控件【英文标题】:Unable to use Winforms control because of unresolved dependencies 【发布时间】:2010-11-08 13:17:15 【问题描述】:

问题:我有一个依赖于 myCli.dll 的 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 的放置位置,我将解决参考问题。我不确定这一点。有人知道我应该怎么做才能解决这个问题吗?

【问题讨论】:

【参考方案1】:

在我的例子中,我的 Initialize 和 Form_Load 代码包含对另一个项目的调用,具体取决于 DLL 引用。通过排除此代码

if (!DesignMode)

    //add your initializing code (for runtime!) here

我能够添加对设计时间的控制。

HTH

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

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

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

【讨论】:

天哪,那是多么糟糕的时代。很高兴我不必再做那些垃圾了【参考方案7】:

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

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

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

    If Me.DesignMode Then Exit Sub
    

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

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
    

    重新构建组件,然后在 WinForms 项目中使用之前重新启动 Visual Studio。出于某种原因,在同一个会话中没有检测到属性的变化,我又烧了几个小时才尝试明显的。

如果您仍然遇到问题,有一篇关于在组件绑定期间获取调试信息(即当您将组件拖放到表单上时)的优秀帖子:How to enable assembly bind failure logging (Fusion) in .NET(向下滚动以回答 Mike Goatly)。

祝你好运。

【讨论】:

以上是关于由于未解决的依赖关系,无法使用 Winforms 控件的主要内容,如果未能解决你的问题,请参考以下文章

由于未满足的依赖关系,无法通过 MIPS 安装 rrdtool-1.7.2

由于未解决的依赖关系,grails install plugin blazeds 失败

未解决的依赖关系 sbt with play framework

无法解决依赖关系。?

无法使用 Play 框架解决依赖关系

WinForms:无法最大化模糊窗口