C#-从程序集调用方法到DllNotFoundException中的其他结果

时间:2018-09-12 20:56:31

标签: c# pinvoke dllimport

我有3个程序集,Assembly2参考Assembly1Assembly3参考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
            } 
       }
    }

我该如何解决?

  • Assembly3Assembly1的引用是唯一的解决方案?

  • 这可以解决合并Assembly1Assembly2的问题吗? (我不知道这可能会破坏某些东西)

1 个答案:

答案 0 :(得分:1)

您的选择包括:

  • 统一所有项目的输出目录; C#:属性>生成>输出路径,C ++:属性>常规>输出目录。
  • 将Assembly3中的引用添加到Assembly1(因为这将把非托管程序集复制到相同的输出目录中)
  • Assembly1.dll必须为somewhere it can be found(假设“ Assembly1.dll”只是标准dll的示例)

第一个选项可能最适合您。

您可能也将不再需要Assembly2对Assembly1的引用。该引用不是使PInvoke / DllImport起作用的原因-它不像在C ++中链接静态库。 PInvoke在运行时而不是编译时处理。这就是为什么您在运行时获得DllNotFoundException而不是像编译/链接C ++那样获得“未定义符号”的原因。该参考将非托管dll复制到可以找到它的输出文件夹。