我有3个程序集,Assembly2
参考Assembly1
和Assembly3
参考Assembly2
。但是从Assembly2
调用Assembly1
中声明的Assembly3
方法会导致DllNotFoundException
。
组装2->组装1
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
的问题吗? (我不知道这可能会破坏某些东西)
答案 0 :(得分:1)
您的选择包括:
Assembly1.dll
必须为somewhere it can be found(假设“ Assembly1.dll”只是标准dll的示例)第一个选项可能最适合您。
您可能也将不再需要Assembly2对Assembly1的引用。该引用不是使PInvoke / DllImport
起作用的原因-它不像在C ++中链接静态库。 PInvoke在运行时而不是编译时处理。这就是为什么您在运行时获得DllNotFoundException
而不是像编译/链接C ++那样获得“未定义符号”的原因。该参考将非托管dll复制到可以找到它的输出文件夹。