无法添加对 dll 的引用

Posted

技术标签:

【中文标题】无法添加对 dll 的引用【英文标题】:A reference to the dll could not be added 【发布时间】:2011-03-28 06:31:14 【问题描述】:

当我在 C# 应用程序中添加一个 .dll 文件作为引用时,它会显示一个错误:

无法添加对“....dll”的引用。请确保 该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

ILDissassembler 说没有有效的 CLR 头,所以我尝试使用 regsvr32 注册它,这给了我另一个错误:

模块“”已加载,但对 DLLRegisterServer 的调用失败 错误代码'0x80004005'

我在 64 位 Windows 7 机器上使用 VS2010 终极版。可能是什么问题?

感谢任何提示/回复

【问题讨论】:

【参考方案1】:

以下内容对我有用:

简答

通过命令行(cmd)运行以下命令:

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

将为您创建一个有效的 dll。

更长的答案

打开cmd

找到 TlbImp.exe。可能位于 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin。如果找不到,请转到根文件夹(C:\ 或 D:)并运行:

dir tlbimp.exe /s              //this will locate the file.

运行 tlbimp.exe 并将您的 dll 放在它后面。示例:如果您的 dll 是 cvextern.dll。你可以运行:

TlbImp.exe cvextern.dll
已在 tlbimp.exe 的同一文件夹中创建了一个新的 dll。您可以在项目中使用它作为参考。

【讨论】:

访问 TlbImp.exe 的另一种方法是打开 Visual Studio 命令提示符。 @Memet Afer 尝试这个我得到了,TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library. 有什么建议吗? 输入文件 C:\Windows\SYSTEM32\SqlServerSpatial.dll' 不是有效的类型库 与 Dineshkumar Ponnusamy 所述的错误相同。请帮帮我 什么时候需要使用 TLBMP?通常在 VS2015 中,如果您只是从引用窗口中添加对 COM DLL 的引用,它会为您处理所有这些。【参考方案2】:

只有当项目是 .NET 程序集时,您才能将 DLL(或 EXE)添加到项目中。如果不是,您将看到此错误消息。

regsvr32 还对 DLL 中的结构和导出函数做出了某些假设。自从我使用它已经有一段时间了,但它与注册 COM 服务器有关,因此某些入口点需要可用。如果 regsvr32 失败,则 DLL 不提供这些入口点,并且 DLL 不包含 COM 组件。

使用 DLL 的唯一机会是像任何其他非 .NET 二进制文件一样导入它,例如当您使用某些 Win32 API 时。有一篇旧的 MSDN 杂志文章可能会有所帮助。有关从何处获取文章的信息,请参阅以下更新。

2018 年 3 月 12 日更新: 指向 MSDN 杂志的链接不再像 2010 年 8 月那样有效。Jason Clark 的文章标题为“.NET 专栏:在 C# 中调用 Win32 DLL P/调用”。它发表在 2010 年 7 月的 MSDN 杂志上。 “回程机器”目前有文章here(格式有限)。整个 MSDN 杂志 2010 年 7 月一期可通过here 获得(仅限 HCM 格式,有关如何使用 HCM 文件的说明here)。

【讨论】:

有没有办法确保编译器将 .dll 放在输出文件夹中,即使它不是参考? @KyleDelaney 我不认为编译器可以做到这一点。我会考虑将 copy 或 xcopy 命令放入项目/解决方案的 pre-build/post-build 事件中。虽然它是手动的,但通常参考不会经常更改,并且适当的测试套件应该可以捕获您忘记更新在构建前/构建后事件中执行的命令的情况。 感谢您的回复! 文章链接已失效。 @Roald 谢谢。是的,链接确实坏了。 Microsoft 仅在不同的 URL 处提供整个 MSDN 杂志问题的 HCM 格式。 Wayback Machine 也有一个 html 格式的文章的快照,具有一些简化的外观。我已经更新了答案以反映这一点,并且我还从我的答案中删除了损坏的链接。希望这会有所帮助。【参考方案3】:

我使用dependency walker 来检查dll 的内部引用。原来它需要 VB 运行时 msvbvm60.dll,由于我的开发盒没有安装,我无法使用 regsvr32 注册它

这似乎是我现在最初问题的答案。

【讨论】:

在我的例子中,我不得不删除我试图引用的项目的 obj 文件夹,然后我重新构建了项目。【参考方案4】:

如果您尝试引用 x86 dll,请确保您的编译器设置为 x86...

我遇到了类似的问题...如上所述,我在 Visual Studio 2012 中尝试使用 OLEDB 从我的 C# 代码访问 Excel 文件。

我不断收到有关无法访问 Access 库的错误,但我知道我已经加载了它。

在调试期间,我突然意识到我正在为 64 位编译但加载了 Office x86。即使我为 32 位加载了 Access 库,它也从未被应用程序使用...因此无法访问。

这是我在 C# 中使用的:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFilePath + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'";

...我遇到了一个错误

我将编译器切换到 x86 后,它就可以工作了

【讨论】:

【参考方案5】:

我刚刚遇到了这个问题,在所有关于使用命令提示符修复它的解释之后,我发现如果你直接将它添加到项目中,你可以简单地在每个需要它的页面上包含该库

【讨论】:

【参考方案6】:

在我的项目中导入 WinSCard.dll 时遇到同样的问题。我像这样处理直接从 dll 导入的问题:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

您可以将其添加到单独的项目中,然后从您的主项目中添加一个引用。

【讨论】:

【参考方案7】:

在构建解决方案期间我的电脑重新启动后,我遇到了这个问题。我的两个引用消失了,所以我不得不手动重建我的两个项目,然后我可以添加引用而不会出错。

【讨论】:

【参考方案8】:

通常在 Visual Studio 2015 中,您应该从 Visual Studio 的模板将 dll 项目创建为 C++ -> CLR 项目,但您可以在事后从技术上启用它:

关键属性称为Common Language Runtime Support 在您的项目配置中设置。它位于Configuration Properties > General > Common Language Runtime Support 下。

执行此操作时,VS 可能不会更新“Target .NET Framework”选项(应该如此)。您可以通过卸载项目、编辑 your_project.xxproj 文件以及添加/更新Target .NET framework Version XML 标记来手动添加它。

对于一个示例,我建议创建一个新的解决方案作为 C++ CLR 项目并检查那里的 XML,甚至可以对其进行比较以确保没有什么非常重要的异常。

【讨论】:

【参考方案9】:

您不能添加对本机 DLL 的引用。但是您可以将它们包含在解决方案中(右键单击解决方案,选择“添加现有文件”),但除非您声明类似

,否则它们不会被引用
[DllImport("...")]
public static extern void MyFunction();

也许有某种 wrapper DLL,您实际上正在引用它并且其中包含 DLL 导入。

有时,您可能会引用包装 DLL,但仍然无法使您的程序运行,错误提示会提示您确保文件存在并且所有依赖项都可用。

此问题是因为您尝试添加的程序集仅针对 x86x64 处理器架构进行编译。

只需尝试在 Build -> Configuration Manager 中将 Target Platform 更改为 x86x64。。 p>

【讨论】:

【参考方案10】:

我需要在配置管理器中将架构从 x64 更改为 x86,并将我的 32 位 dll(C 语言 - pcProxAPI.dll)复制到此创建的新文件夹中。这是“Sashus”@987654321 描述的步骤之上@。

C:\Projects..\bin\x86\Debug

【讨论】:

这也是他给我的问题。 但是如果默认不是x86也不是x64?但是....“任何 Cpu”出现了...? codeproject.com/articles/1160645/… 复制 32 位 dll 的任何 cpu 都可以工作【参考方案11】:

当我尝试将我刚刚用 C++ 编写的 dll 添加到我的新 C# 项目时,我遇到了同样的问题。原来我需要设置我的 dll 来自的 C++ 项目的属性:

Configuration Properties\General\Common Language Runtime Support: /clr Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

因为我想在其中使用这个 dll 的 C# 项目也是这样设置的(将相同的属性设置为 /clr)。

【讨论】:

解决方案资源管理器 > 属性 > 配置属性 @gumuruh 如果你的意思是“什么是 clr?”,那么 CLR 就是 docs.microsoft.com/en-us/dotnet/standard/clr【参考方案12】:

我遇到了类似的问题。我试图将 .net 2.0 dll 的引用添加到 .Net 1.1 项目中。当我尝试添加在 .Net 1.1 中编译的以前版本的 .dll 时。它对我有用。

【讨论】:

【参考方案13】:

对于在此问题上寻求帮助或遇到 FileNotFoundException 或 FirstChanceException 的其他任何人,请在此处查看我的答案:

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll - windows phone

一般而言,您必须绝对确定自己满足了提供参考的所有要求 - 我知道这是显而易见的答案,但您可能忽略了一个相对简单的要求。

【讨论】:

查看与参考相关的框架版本之间的差异 - 很多时候使用较新的框架版本应该不会产生影响。【参考方案14】:

我在编写 Windows 服务时遇到了这个错误。我以管理员身份运行 Visual Studio,以便我的后期构建命令会自动安装我的服务。我注意到,当我关闭所有内容并正常运行 VS(不是以管理员身份)时,它让我添加引用就好了,没有错误。

希望此解决方案适合您。

【讨论】:

【参考方案15】:

我的回答有点晚了,但作为一个快速测试,请确保您使用的是最新版本的库。

在我的情况下,在更新引用另一个库的 nuget 库后导致问题消失了。

【讨论】:

【参考方案16】:

您可以手动添加 .dll 文件。例如,如果您想在 WPF 应用程序中添加一个 dll 文件,而您无法在项目中引用它

(出现错误:无法添加对“....dll”的引用。请确保该文件可访问并且它是有效的程序集或 COM 组件),

然后复制该 dll 文件并粘贴到 INSTALLER PROJECT(在应用程序文件夹中)。

【讨论】:

【参考方案17】:
    启动 cmd.exe 并输入: Regsvr32 %dllpath% "%dllpath%" 替换为您的 dll 路径

【讨论】:

【参考方案18】:

当我尝试将自己的 c++ dll 添加到 c# (4.7.2) 项目时遇到了同样的问题

c++ 项目编译为 x86 (win32) c#被编译为x86

解决方案是将 c++ 编译为 CLR

【讨论】:

以上是关于无法添加对 dll 的引用的主要内容,如果未能解决你的问题,请参考以下文章

无法添加 API DLL 作为对 windows phone 8 的引用

无法在 C#.Net 4.0 Visual Studio 中添加对 rzdcx.DLL 的引用

关于dll文件的引用问题

如何添加对 System.Numerics.dll 的引用

无法将本机 .dll 引用添加到源生成器项目

未能添加对***.dll的引用 问题解决方法