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