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' 并且它工作正常。
我在实现我的 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' 并且它工作正常。