C# - 从Assembly调用方法到其他导致DllNotFoundException

问题描述 投票:0回答:1

我有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是唯一的解决方案?
  • 这可以解决合并Assembly1Assembly2? (我不知道这可能会破坏一些东西)
c# pinvoke dllimport
1个回答
1
投票

您的选择包括:

  • 统一所有项目的输出目录; C#:Properties> Build> Output Path,C ++:Properties> General> Output Directory。
  • 将Assembly3的引用添加到Assembly1(因为这会将非托管程序集复制到同一个输出目录)
  • Assembly1.dll需要是somewhere it can be found(假设“Assembly1.dll”只是标准dll的一个例子)

第一种选择可能是最适合您的。

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

© www.soinside.com 2019 - 2024. All rights reserved.