无法添加引用.NET

本文关键字:NET 引用 添加 | 更新日期: 2023-09-27 18:27:20

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

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

我研究了一点,发现这个错误是因为程序集不受.NET管理,我应该使用DLLImport属性,然而,我在另一台计算机上有同样的确切解决方案,一切都很好。

不同的是,我试图添加引用的新计算机是x64,而旧计算机是x86。

我有x64和x86 DLL,无法添加任何DLL。为什么会发生这种情况?

无法添加引用.NET

无论32/64"位"如何,都不能在Visual Studio中将非托管DLL添加为引用。我怀疑它在你的x86机器上是否有效。

"普通"DLL和COM DLL之间有区别。

在COM-DLL向系统注册后,您可以添加对它的引用(实际上,您引用了公开的COM对象,并自动添加了对DLL的引用)。这可以在"添加引用"对话框的"COM"选项卡上完成(在大多数情况下,您必须确保您的项目是作为x86目标构建的)。

正如我所说,"普通"DLL根本不能添加。您可以包含在解决方案中(右键单击解决方案,选择"添加现有文件"),但除非您声明类似的内容,否则它们不会被引用

[DllImport("...")]
public static extern void MyFunction();

我怀疑在您的另一个解决方案中,有某种包装器DLL,您实际上正在引用它,它包含DLL导入。

您的问题有多个答案:

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

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

类型库导入程序(Tlbimp.exe)可能会有所帮助。它创建了一个包装器.NET dll。原始COM DLL必须仍然存在并且必须注册!(尝试先注册,然后再使用TlbImp进行尝试。)

如果64位版本不起作用,请在项目生成属性中将平台目标设置为x84

有些DLL不能添加为引用,但它们仍然可以被C#与著名的[DllImport( params go here...)] 一起使用

您可能还必须inspect dll才能获得要使用的函数的地址。这可以通过使用GetProcAddress 来实现

在尝试分析问题后,我发现以下

[1] 有时您会在引用管理器中看到引用,但在提到的目录中找不到dll文件引用管理器不能实现引用。

[2] 检查dll文件的权限。

我的建议是检查是否使用extern关闭C++名称篡改"C";。

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

例如;foo.h";应该是:

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

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

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

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