无法添加引用.NET。

13

我有一个DLL文件,想将其作为我的项目的引用添加进去,但每次尝试时都会弹出一个对话框告诉我:

无法添加引用。请确保该文件可访问,并且是有效的程序集或COM组件。

我进行了一些研究,发现这个错误是由于该程序集未被.NET管理,应该使用DLLImport属性,然而,我在另一台电脑上完全相同的解决方案可以正常工作。

区别在于我尝试添加参考的新电脑是x64位的,而旧的是x86位的。

我拥有x64和x86 DLL文件,但无法添加任何一个。这是为什么?


你可能需要像答案中提到的DllImport和P/Invoke这样的东西。 - Bahamut
7个回答

14
无论是32位还是64位,您都无法在Visual Studio中将非托管的DLL添加为引用。而且我怀疑它在您的x86计算机上也不能正常工作。
“普通”DLL和COM-DLL之间存在区别。
在系统注册后,您可以向COM-DLL添加引用(实际上是引用公开的COM对象,然后自动添加对DLL的引用)。这可以在“添加引用”对话框的“COM”选项卡上完成(在大多数情况下,您必须确保您的项目以x86目标构建)。
“普通”DLL则无法被添加。您可以将其包含在解决方案中(右键单击解决方案,选择“添加现有文件”),但是除非声明类似于
[DllImport("...")]
public static extern void MyFunction();

我怀疑在您的其他解决方案中,存在某种包装 DLL,您实际上是在引用它,并且其中包含 DLL 导入。


我会构建到自定义目录,例如../bin/,并将所需的DLL放置在该目录中,这样我的应用程序就可以默认地找到它们。很简单! - user710046

3

对于您的问题,有多种答案:

  1. 您可能会遇到这个问题,因为您尝试添加的程序集是针对x86处理器架构进行定位和编译的。只需尝试将目标平台从x64更改为x86,即使这样不起作用,也请尝试将其更改为AnyCPU。AnyCPU平台目标使您的应用程序在两种架构上都可以执行,因为它是无架构的。

  2. 如果程序集恰好是DLL,并且无法作为引用添加,则它不是COM.NET程序集。它将是像其他本机程序集一样的本机程序集(例如,shell32.dll,user32.dl等)。您必须通过DllImport属性使用它们,但是您必须先检查该dll的文档以获取实现在该dll中的函数列表。


2
可能 类型库导入程序(Tlbimp.exe) 可以帮助。它会创建一个 .NET 包装器 dll。原始的 COM DLL 必须仍然存在并且必须已注册!(在尝试使用 TlbImp 之前,请尝试先注册它。)
如果 64 位版本无法工作,请在项目构建属性中将平台目标设置为 x84

1

有些 DLL 无法作为引用添加,但是它们仍然可以通过 C# 使用著名的 [DllImport( 参数在这里...)]

您可能还需要 检查 DLL 以获取要使用的函数的地址。这可以通过使用 GetProcAddress 来实现。


1
在尝试分析问题后,我发现以下情况:
[1] 有时您会在引用管理器中看到引用,但在提到的目录中找不到dll文件,其中引用管理器无法更新引用。
[2] 检查您的dll文件的权限。

0

我的建议是检查是否使用extern "C"关闭C++名称修饰。

当我没有声明我的DLL API时,我遇到了相同的DLL访问错误。

例如,一个“foo.h”应该是:

extern "C"
{
__declspec( dllexport ) void foo();
} 

然后我们可以这样在C#中调用"foo()":

public const string DllName = "foo.dll";
[DllImport(DllName, EntryPoint = "foo", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void foo();

-1

尝试将您的平台目标从 Any CPU 更改为 x86。(项目属性 -> 构建 -> 平台目标)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接