无法添加引用.NET
本文关键字:NET 引用 添加 | 更新日期: 2023-09-27 18:27:20
我有一个DLL,我想添加它作为我项目的引用,但每次我尝试添加它时,都会弹出一个对话框,告诉我:
无法添加引用。请确保该文件是可访问的,并且是有效的程序集或COM组件。
我研究了一点,发现这个错误是因为程序集不受.NET管理,我应该使用DLLImport属性,然而,我在另一台计算机上有同样的确切解决方案,一切都很好。
不同的是,我试图添加引用的新计算机是x64,而旧计算机是x86。
我有x64和x86 DLL,无法添加任何DLL。为什么会发生这种情况?
无论32/64"位"如何,都不能在Visual Studio中将非托管DLL添加为引用。我怀疑它在你的x86机器上是否有效。
"普通"DLL和COM DLL之间有区别。
在COM-DLL向系统注册后,您可以添加对它的引用(实际上,您引用了公开的COM对象,并自动添加了对DLL的引用)。这可以在"添加引用"对话框的"COM"选项卡上完成(在大多数情况下,您必须确保您的项目是作为x86目标构建的)。
正如我所说,"普通"DLL根本不能添加。您可以将包含在解决方案中(右键单击解决方案,选择"添加现有文件"),但除非您声明类似的内容,否则它们不会被引用
[DllImport("...")]
public static extern void MyFunction();
我怀疑在您的另一个解决方案中,有某种包装器DLL,您实际上正在引用它,它包含DLL导入。
您的问题有多个答案:
-
您可能会遇到这个问题,因为您试图添加的程序集是针对x86处理器体系结构进行编译的。只需尝试将目标平台从x64更改为x86,即使不起作用,也可以尝试将其更改为AnyCPU。AnyCPU平台目标使您的应用程序可在这两种类型的体系结构上执行,因为它是无体系结构的。
-
如果程序集恰好是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。(项目属性->构建->平台目标)