为什么我的C#程序在运行时找不到在项目中引用的C++/CLI DLL?

3

我最近使用C++/CLI编写了一个小的本地C++包装器,这是一个简单的程序。我能够正确编译它,并且在没有任何错误的情况下将dll引用添加到我的C#项目中。我还可以从这个CPP/CLI dll创建对象,并在编译时访问函数而不出错。

现在,当我运行程序时,第一个调用此dll中对象的函数会抛出异常。异常如下:

无法加载文件或程序集“ProtobufWrapper,Version=1.0.4381.26401,Culture=neutral,PublicKeyToken=null”或其某个依赖项。系统找不到指定的文件。

我不确定我的情况出了什么问题。


你是否在运行它的主机上查看了GAC? - tacos_tacos_tacos
你的C++/CLI项目引用了其他程序集吗? - M.Babcock
@M.Babcock:我认为如果找到了DLL但无法加载,错误消息会略有不同。导致加载失败的常见原因包括缺少依赖项和错误的架构(即在x64进程中使用x86 DLL)。但在这种情况下,它可能不在库搜索路径中。 - Ben Voigt
你尝试过从VS中添加引用吗?还要检查一下是否可以将dll加入GAC。你使用的是哪个版本的VS?如果是2010,请记住它有自己独立的2.0和3.5 GAC。 - MethodMan
1个回答

2

该 DLL 文件是否与您启动的 .Exe 文件位于同一目录中?有时文件不会被复制,因此无法找到。

在 DLL 引用上单击属性,检查构建操作。将其设置为“复制”。


1
感谢大家的回复。我意识到 DLL 没有被复制到主程序的二进制文件夹中。原因是我引用 C++/CLI 库的 C# 程序只是另一个库,它被用在另一个 C# 主程序中。我忘记在主 C# 程序中添加对我的 C++/CLI 库的引用了。现在一切都很好。 - Alok
1
有没有办法明确指定加载 DLL 的位置?我想避免把它们放在同一个目录中。我尝试将 C# DLL 的位置添加到 PATH 中,但没有帮助。 - Mark Vincze
2
@Mark:是的,处理 AppDomain.AssemblyResolve 事件。此外,这还使您能够根据进程是32位还是64位选择不同的C++ / CLI混合模式DLL。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接