C#-从程序集调用方法到其他方法会导致DllNotFoundException

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(){ }

我有3个程序集,
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
    需要(假设“Assembly1.dll”只是标准dll的一个示例)
第一种选择可能是最适合你的


您也可能不再需要从Assembly2到Assembly1的引用。这个引用不是什么使/<代码> dLimPult工作-它不像在C++中连接静态库。PInvoke是在运行时而不是编译时处理的。这就是为什么你在运行时得到 DLLNODFUNCTUDXCEPROT/<代码>而不是像编译C++时所定义的“未定义的符号”那样。引用正在将非托管dll复制到可以找到它的输出文件夹。

将非托管dll与工作的可执行文件放在同一目录中,但我需要将非托管dll复制到每个程序集的目录或每次移动程序集时。这可以解决将非托管DLL与其他DLL合并的问题吗?我不知道
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
            } 
       }
    }