2009-07-07 53 views
5

问题:我有一个WinForms控件('MyControl'),它依赖于myCli.dll,一个用C++ CLI编写的dll。该组件是第三方(由另一个团队编写)。 myCli.dll依赖于由另一方编写的myLibrary.dll。该控件位于myAssembly.dll中,该文件是C#控件和资源库。由于未解决的依赖关系,无法使用Winforms控件

当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放在哪里,我会解决参考问题。我不知道这是肯定的。有人知道我应该怎么做来解决这个问题吗?

回答

0

我认为DLL需要进入项目目录,然后将其设置为复制到生成的输出目录。

+0

我试过了。它没有工作 – MedicineMan 2009-07-07 16:47:41

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时,它将所有文件复制到调试/发布文件夹,然后从调试/发布文件夹中引用项目中的这些控件直。

1

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

if (!DesignMode) 
{ 
    //add your initializing code (for runtime!) here 
} 

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

HTH

0

我知道这是一个古老的线程,但只是插嘴与我用来解决我确切的问题。

我最初使用PeterRakké的解决方案(https://stackoverflow.com/a/15077337/34440)。但它并不是理想的,因为它迫使我改变一贯的模式。

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

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

+0

上帝是那些可怕的时代。很高兴我不必再做那种垃圾了 – MedicineMan 2013-03-20 21:33:16

0

与MedicineMan相同的情况。 WinForms项目使用libraryA.dll中的两个不同组件,而这些组件又依赖于libraryB.dll。为我工作

解决方案(只是参照适用的DLL文件中的所有项目,即使所有的图书馆都建在调试模式,且无需手动复制DLL文件到不同的文件夹):

  1. 对于LibraryA的组件。 DLL,它覆盖绘制的事件,如果出口在设计时模式:

    If Me.DesignMode Then Exit Sub 
    
  2. 有关使用各类公共场所,libraryB.dll在libraryA.dll组件,使用属性来隐藏从设计师这些属性(仔细检查语法 - 我已经看到有一些奇怪的拼写/变化等几个职位):

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

如果你仍然有问题,有对部件中获得调试信息结合的优秀后(即当你拖欧米茄下降组件到形式):How to enable assembly bind failure logging (Fusion) in .NET(向下滚动由Mike Goatly回答) 。

祝你好运。