C#-从程序集调用方法到其他方法会导致DllNotFoundException
我有3个程序集,C#-从程序集调用方法到其他方法会导致DllNotFoundException,c#,pinvoke,dllimport,C#,Pinvoke,Dllimport,我有3个程序集,Assembly2参考Assembly1,和Assembly3参考Assembly2。但是从Assembly3调用Assembly1中声明的Assembly2方法会导致DllNotFoundException Assembly2->Assembly1 Assembly3->Assembly2 extern "C" namespace Assembly1 { __declspec(dllexport) void SomeMethod(){ }
Assembly2
参考Assembly1
,和Assembly3
参考Assembly2
。但是从Assembly3
调用Assembly1
中声明的Assembly2
方法会导致DllNotFoundException
Assembly2->Assembly1
Assembly3->Assembly2
extern "C" namespace Assembly1
{
__declspec(dllexport) void SomeMethod(){ }
}
_
_
我怎样才能解决这个问题
- 将引用从
添加到Assembly3
是唯一的解决方案吗Assembly1
- 这能解决合并
和Assembly1
的问题吗?(我不知道这会弄坏什么东西)Assembly2
- 统一所有项目的输出目录;C#:属性>生成>输出路径,C++:属性>常规>输出目录
- 将引用从Assembly3添加到Assembly1(因为这需要将非托管程序集复制到同一输出目录)
需要(假设“Assembly1.dll”只是标准dll的一个示例)Assembly1.dll
您也可能不再需要从Assembly2到Assembly1的引用。这个引用不是什么使/<代码> dLimPult工作-它不像在C++中连接静态库。PInvoke是在运行时而不是编译时处理的。这就是为什么你在运行时得到
DLLImport
是否在那种情况下工作。没有合并托管程序集和非托管DLL这样的事情。将非托管DLL与可执行文件放在同一目录中。这是一个基本文件未找到错误。当你不做任何特殊的事情时,你总是会得到它,C++构建系统有不同于C语言构建系统的默认值。您的C++项目将文件放入解决方案目录的调试子目录中,C.*项目将文件放入项目目录的bin \调试子目录中。除了将文件复制到可以找到的地方之外,还必须给出一些建议,通常最简单的解决方案是将C#project的“项目>属性>生成”选项卡“输出路径”设置从bin\Debug更改为..\Debug。使用资源管理器验证结果是否正确
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
}
}
}