C# 中的引用 DLL 不起作用

Reference DLL's in C# does not work

我在实现我的 DLL 之一时遇到了很大的问题。

这就是问题所在:我有一个 DLL,我们将其命名为 Common.dll,它在我的 C# 项目中被引用。此 DLL 调用另一个名为 SoloistCore64.dll.

的 DLL

此外,我还有一个工作示例程序和我自己的。 在我自己的程序中,Common.dll 由于某种原因找不到 SoloistCore64.dll。在我的示例程序中,一切正常。

在两个项目中,两个 DLL 都在同一目录中,属性 管理器中的所有路径都是正确的。我的 Common.dll 的参考被识别并正常工作。

示例程序与我自己的相比只有一处不同,我不明白是什么意思。

这是参考在我自己的项目中的样子。 (不工作)

这是它在示例程序中的样子。 (工作)

我只能假设这个蓝色图标表示我的参考无效的原因。有谁知道这是什么意思?我在图片库中找不到它。

例外说

InnerException: 
       HResult=-2146233052
       Message=Die DLL "SoloistCore64.dll": Module not found. (Exception HRESULT: 0x8007007E) can not be load.
       Source=Aerotech.Soloist
       TypeName=""
       StackTrace:
            bei Aerotech.Soloist.Core.Wrapper.dllUtilMachineConfOpenx64(IntPtr argument1, StringBuilder argument2)
            bei Aerotech.Soloist.Core.Wrapper.dllUtilMachineConfOpen(IntPtr argument1)
            bei Aerotech.Soloist.Communication.NetworkSetup..ctor()
            bei Aerotech.Soloist.Controller..cctor()
       InnerException: 

我将 .dll 放在每个可能的目录中,但它不起作用。

更新: 我现在尝试了以下。我将所有 dll 添加到 system32 和 syswow64 目录,现在它可以工作了!我不知道为什么,...我的参考在一个完全不同的目录中...

这些 不是 引用,最明显的是它们不在项目的引用节点内。像这样将 DLL 添加到项目中的唯一目的是将它们复制到项目的构建目录中。这很有用,因为当 OS 可以找到这些 DLL 时,您的程序只能 运行。他们的构建操作 属性 应该是 "Content",他们的复制到输出目录 属性 应该是 "Copy if newer".

non-working 版本的问题是 DLL 被复制到 bin\Debug\libs 目录。 OS 不知道它需要在子目录中查找任何 DLL。您必须提供帮助,例如调用 SetDllDirectory() 或将子目录添加到 Path 环境变量。

在工作版本中没有问题,DLL 被复制到 bin\Debug。 OS 总是首先在存储 EXE 的目录中查找。这应该 always 是您的偏好,因为它可以轻松避免 DLL Hell。如果您不喜欢它们在项目的顶层节点中可见,请使用 post-build event 来 xcopy DLL。

当您需要在 32 位和 64 位代码中进行此操作时,您往往会遇到非常痛苦的 [DllImport],因为 DLL 名称不同。阅读 this post 以获得解决方案。

我自己解决了这个问题。最简单的方法是手动将 dll.s 放入 debug/bin 和 release/bin 文件夹中。但是我添加了我的两个 dotNet DLL 作为参考。非托管 C++ DLL 作为 link 添加到同一项目(项目->添加现有项->Dropdownmenu[添加为 Link])。之后你必须将 DLL 的 'Copy to Output' 属性 设置为 'Always Copy' 并且它工作正常。