我有一个DLL,我想添加它作为我的项目的参考,但每次我尝试这样做时会弹出一个对话框告诉我:
无法添加引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件。
我已经研究了一点,发现错误是因为程序集不受.NET管理,我应该使用DLLImport属性,但是,我在另一台计算机上有完全相同的解决方案,而且everythig工作得很好。
不同之处在于我尝试添加引用的新计算机是x64而旧计算机是x86。
我同时拥有x64和x86 DLL,并且无法添加任何内容。为什么会这样?
答案 0 :(得分:12)
无论32/64“bittyness”如何,都无法在Visual Studio中添加非托管DLL作为引用。我怀疑它在你的x86机器上有效。
“普通”DLL和COM-DLL之间存在差异。
您可以在向系统注册后添加对COM-DLL的引用(实际上您引用了公开的COM对象并自动添加了对DLL的引用)。这可以在“添加引用”对话框的“COM”-Tab上完成(在这里,您必须确保在大多数情况下将项目构建为x86目标)。
“正常”的DLL可以 - 正如我所说 - 根本不添加。您可以在解决方案中包含它们(右键单击解决方案,选择“添加现有文件”),但除非您声明类似
,否则不会引用它们[DllImport("...")]
public static extern void MyFunction();
我怀疑在你的其他解决方案中,有一些包装器DLL,你实际上是引用它并包含DLL导入。
答案 1 :(得分:2)
您的问题有多次回复:
您可能会遇到此问题,因为您尝试添加的程序集是针对x86处理器体系结构进行定位和编译的。只需尝试将目标平台从 x64 更改为 x86 ,即使这样做有效,也可以尝试将其更改为 AnyCPU 。 AnyCPU Platform目标使您的应用程序在两种类型的体系结构上都可执行,因为它是无架构的。
如果程序集恰好是DLL,并且无法作为参考添加,那么不 COM 以及 .NET 程序集。它将像其他人一样是本机程序集(例如,shell32.dll,user32.dl等)。您必须通过 DllImport 属性使用它们,但您必须先检查该dll的文档以获取该dll中实现的函数列表。
答案 2 :(得分:1)
Type Library Importer (Tlbimp.exe)可能会有所帮助。它创建一个包装器.NET DLL。原始COM DLL必须仍然存在,必须注册! (在尝试使用TlbImp之前,先尝试注册它。)
如果64位版本不起作用,请在项目构建属性中将平台目标设置为x84
。
答案 3 :(得分:0)
某些DLL无法作为参考添加,但是,C#仍然可以使用它们与着名的[DllImport( params go here...)]
您可能还需要inspect
dll才能获取要使用的函数的地址。这可以通过使用GetProcAddress
答案 4 :(得分:0)
将dll的绝对路径添加到DllImport
答案 5 :(得分:0)
在尝试分析问题后,我发现了以下内容
[1]有时你会在引用管理器中看到引用,但你不会在提到的目录中找到dll文件 参考管理器无法实现参考。
[2]检查你的dll文件的权限。
答案 6 :(得分:-1)
尝试将平台目标从任意CPU更改为x86。 (项目属性 - >构建 - >平台目标)