由于未解析的依赖项,无法使用Winforms控件

时间:2009-07-07 00:05:35

标签: c# .net winforms user-controls controls

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

当myCli.dll没有对myLibrary.dll的依赖时,我的控件运行得很好。我可以将它添加到表单,构建它,等等。但myCli.dll的新版本问世,我重新反对它。突然,IDE表现得很糟糕。关键问题似乎是IDE无法解析myLibrary.dll上的myCli.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的位置,我将解决参考问题。我肯定不知道。有人知道我应该怎么做来解决这个问题吗?

7 个答案:

答案 0 :(得分:1)

在我的情况下,我的Initialize和Form_Load代码包含对另一个项目的调用,具体取决于DLL引用。通过

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

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

HTH

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我知道这是一个老线程,但只是用我用来修复我的确切问题的方式。

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

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

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

答案 6 :(得分:0)

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

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

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

    If Me.DesignMode Then Exit Sub
    
  2. 对于libraryA.dll中使用来自libraryB.dll的类型的公共属性的组件,请使用属性从设计器中隐藏这些属性(仔细检查语法 - 我看过其他一些有一些奇怪的拼写/变体的帖子):

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

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

    祝你好运。