【问题标题】:C# - Calling method from an Assembly to other result in DllNotFoundExceptionC# - 从程序集调用方法到其他导致 DllNotFoundException
【发布时间】:2018-09-12 20:56:31
【问题描述】:

我有 3 个程序集,Assembly2 参考 Assembly1 和 Assembly3 参考 Assembly2。但是从Assembly3 调用Assembly1 中声明的Assembly2 方法会导致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 的问题吗? (我不知道这可能会破坏某些东西)

【问题讨论】:

  • 把非托管DLL和可执行文件放在同一目录
  • 可行,但我需要将非托管 DLL 复制到每个程序集的目录或每次移动程序集时。这可以解决将非托管 DLL 与其他 DLL 合并的问题吗?我不知道DLLImport 在那种情况下是否有效。
  • 没有合并托管程序集和非托管 DLL 这样的事情。将非托管 DLL 放在与可执行文件相同的目录中。
  • 这是一个基本的文件未找到错误。当你不做任何特别的事情时,你总会得到它,C++ 构建系统的默认值与 C# 构建系统不同。您的 C++ 项目将文件放入 solution 目录的 Debug 子目录,C# 项目将文件放入 project 目录的 bin\Debug 子目录。除了将文件复制到可以找到的位置之外,通常最简单的解决方案是更改 C# 项目的 Project > Properties > Build 选项卡,将“输出路径”设置从 bin\Debug 更改为 ..\Debug。使用 Explorer 验证结果是否良好

标签: c# pinvoke dllimport


【解决方案1】:

您的选择包括:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2014-10-10
    相关资源
    最近更新 更多