【发布时间】:2018-09-12 20:56:31
【问题描述】:
我有 3 个程序集,Assembly2 参考 Assembly1 和 Assembly3 参考 Assembly2。但是从Assembly3 调用Assembly1 中声明的Assembly2 方法会导致DllNotFoundException。
Assembly2 -> Assembly1
Assembly3 -> Assembly2
extern "C" namespace Assembly1
{
__declspec(dllexport) void SomeMethod(){ }
}
_
namespace Assembly2
{
public static class OtherClass
{
[DllImport("Assembly1.dll")]
public static extern void SomeMethod();
}
}
_
namespace Assembly3
{
public static class SomeClass
{
public static void SomeOtherMethod()
{
OtherClass.SomeMethod(); //DllNotFoundException, Cannot load Assembly1
}
}
}
我该如何解决?
添加从
Assembly3到Assembly1的引用是唯一的解决方案吗?这可以解决合并
Assembly1和Assembly2的问题吗? (我不知道这可能会破坏某些东西)
【问题讨论】:
-
把非托管DLL和可执行文件放在同一目录
-
可行,但我需要将非托管 DLL 复制到每个程序集的目录或每次移动程序集时。这可以解决将非托管 DLL 与其他 DLL 合并的问题吗?我不知道
DLLImport在那种情况下是否有效。 -
没有合并托管程序集和非托管 DLL 这样的事情。将非托管 DLL 放在与可执行文件相同的目录中。
-
这是一个基本的文件未找到错误。当你不做任何特别的事情时,你总会得到它,C++ 构建系统的默认值与 C# 构建系统不同。您的 C++ 项目将文件放入 solution 目录的 Debug 子目录,C# 项目将文件放入 project 目录的 bin\Debug 子目录。除了将文件复制到可以找到的位置之外,通常最简单的解决方案是更改 C# 项目的 Project > Properties > Build 选项卡,将“输出路径”设置从 bin\Debug 更改为 ..\Debug。使用 Explorer 验证结果是否良好