C#中的引用DLL不起作用

时间:2016-01-06 11:40:20

标签: c# dll reference icons

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

这就是问题:我有一个DLL,我们称之为Common.dll,在我的c#项目中引用它。此DLL调用另一个名为SoloistCore64.dll的DLL。

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

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

与我自己相比,示例程序中只有一个差异,我无法找出它的含义。

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

My own program2

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

sample program 我只能假设这个蓝色图标表示我的参考不起作用的原因。有谁知道这意味着什么?我在图像库中找不到它。

例外说

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目录中,现在它可以工作了!我不知道为什么,...我的参考是在一个完全不同的目录......

2 个答案:

答案 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)

我自己解决了这个问题。最简单的方法是手动将dll.s放在debug / bin和release / bin文件夹中。但是我添加了两个dotNet DLL作为参考。非托管c ++ DLL,作为指向同一项目的链接添加(项目 - >添加现有项目 - > Dropdownmenu [添加为链接])。之后,您必须将“复制到输出”设置为'您的DLL的属性为“始终复制”'它工作正常。