我在实现我的一个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目录中,现在它可以工作了!我不知道为什么,...我的参考是在一个完全不同的目录......
答案 0 :(得分:3)
这些不引用,最常见的是它们不在项目的References节点内。将DLL添加到项目中的唯一方法就是将它们复制到项目的构建目录中。这很有用,因为您的程序只能在操作系统可以找到这些DLL时运行。他们的Build Action属性应该是" Content",他们的Copy to Output Directory属性应该是"如果更新"则复制。
非工作版本的问题是DLL被复制到bin \ Debug \ libs目录。操作系统不知道它需要在任何DLL的子目录中查找。您需要提供帮助,例如对SetDllDirectory()进行消除或将子目录添加到Path环境变量。
在工作版本中没有问题,DLL被复制到bin \ Debug。操作系统始终首先查看存储EXE的目录。这应该始终是你的偏好,因为它通常避免DLL地狱。如果你讨厌它们在项目的顶级节点中可见,那么使用post-build event来复制DLL。
当你需要在32位和64位代码中完成这项工作时,你往往会非常痛苦[DllImport],因为DLL名称不同。请阅读this post以获取解决方案。
答案 1 :(得分:0)