.net 无法使用Winforms控件,因为存在未解析的依赖项

kognpnkq  于 11个月前  发布在  .NET
关注(0)|答案(8)|浏览(172)

问题:我有一个WinForms控件(“MyControl”),它依赖于myCli.dll,一个用C++ CLI编写的dll。这个组件是第三方(由另一个团队编写)。myCli.dll依赖于myLibrary.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,我将解决引用问题。我不知道这是肯定的。有人知道我应该做什么来解决这个问题?

5lhxktic

5lhxktic1#

在我的例子中,我在Initialize和Form_Load上的代码包含对另一个项目的调用,这取决于DLL引用。

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

字符串
我可以在设计时添加控件。
HTH

2izufjch

2izufjch2#

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

ljo96ir5

ljo96ir53#

对于设计器支持,我认为myLibrary.dll必须进入C:\Program Files\Visual Studio xxx\Common7\IDE\PublicAssemblies(假设myCLI.dll也在那里),或者到myCLI.dll存在的地方,或者你可以尝试将它复制到C:\Windows\System32-系统应该能够找到它。
确保将其添加到项目中,并将其设置为Clippit '98建议的“始终复制”。

ijnw1ujt

ijnw1ujt4#

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

3xiyfsfu

3xiyfsfu5#

myCli.dll和它的所有依赖项需要在完全相同的文件夹中,否则VS将无法找到它们。
最简单的方法是确保在构建myCli.dll时,将所有文件复制到Release/Release文件夹中,然后直接从Release/Release文件夹引用项目中的这些控件。

esbemjvw

esbemjvw6#

我知道这是一个老线程,但只是与我用来解决我的确切问题。
我最初使用了Peter Rakké的解决方案(https://stackoverflow.com/a/15077337/34440),但它并不是理想的解决方案,因为它迫使我改变了通常的模式。
由于我的C++/CLI在执行时只使用本机dll中的函数,并且包含自己的接口信息,我只是将本机dll更改为延迟加载。(项目属性->配置属性->链接器->输入->延迟加载的DLL)。确保将属性对话框顶部的配置和平台下拉唐斯设置为所有选项,并执行完整的重建。
然后,我可以在嵌套控件和窗体中引用C++/CLI DLL中的类型。

ff29svar

ff29svar7#

与MedicineMan. WinForms项目的情况相同,在libraryA.dll中使用了2个不同的组件,而libraryA.dll又依赖于libraryB.dll。
适合我的解决方案(仅引用所有项目中适用的DLL,即使所有库都是在调试模式下生成的,也不需要手动将DLL复制到不同的文件夹中):
1.对于libraryA.dll中重写绘制事件的组件,如果处于设计时模式,则退出:

If Me.DesignMode Then Exit Sub

字符串
1.对于libraryA.dll中具有公共属性(使用libraryB.dll中的类型)的组件,请使用attributes对设计器隐藏这些属性(仔细检查语法--我还看到过其他几篇文章中有一些奇怪的拼写/变体):

<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>


1.重新生成组件,然后在WinForms项目中使用之前重新启动Visual Studio。由于某种原因,在同一会话中没有检测到属性的更改,在尝试明显的更改之前,我又花了几个小时。
如果您仍然有问题,有一个关于在组件绑定过程中获取调试信息的很好的帖子(即当您将组件拖放到表单上时):How to enable assembly bind failure logging (Fusion) in .NET(向下滚动到Mike Goatly的答案)。
祝你好运

kyvafyod

kyvafyod8#

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

相关问题