我有一个DLL文件,想将其作为我的项目的引用添加进去,但每次尝试时都会弹出一个对话框告诉我:
无法添加引用。请确保该文件可访问,并且是有效的程序集或COM组件。
我进行了一些研究,发现这个错误是由于该程序集未被.NET管理,应该使用DLLImport属性,然而,我在另一台电脑上完全相同的解决方案可以正常工作。
区别在于我尝试添加参考的新电脑是x64位的,而旧的是x86位的。
我拥有x64和x86 DLL文件,但无法添加任何一个。这是为什么?
我有一个DLL文件,想将其作为我的项目的引用添加进去,但每次尝试时都会弹出一个对话框告诉我:
无法添加引用。请确保该文件可访问,并且是有效的程序集或COM组件。
我进行了一些研究,发现这个错误是由于该程序集未被.NET管理,应该使用DLLImport属性,然而,我在另一台电脑上完全相同的解决方案可以正常工作。
区别在于我尝试添加参考的新电脑是x64位的,而旧的是x86位的。
我拥有x64和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中的函数列表。
x84
。有些 DLL 无法作为引用添加,但是它们仍然可以通过 C# 使用著名的 [DllImport( 参数在这里...)]
您可能还需要 检查
DLL 以获取要使用的函数的地址。这可以通过使用 GetProcAddress
来实现。
我的建议是检查是否使用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();
尝试将您的平台目标从 Any CPU 更改为 x86。(项目属性 -> 构建 -> 平台目标)