无法添加对dll的引用


95

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

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

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

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

我在64位Windows 7计算机上使用VS2010最终版本。可能是什么问题呢?

感谢您的任何提示/回复

Answers:


53

以下为我工作:

简短答案

通过命令行(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。您可以在项目中将其用作参考。

5
访问TlbImp.exe的另一种方法是打开Visual Studio命令提示符。
斯科特,

75
@Memet尝试这个我得到了,有TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.什么建议吗?
Dineshkumar,2014年

1
输入文件C:\ Windows \ SYSTEM32 \ SqlServerSpatial.dll'不是有效的类型库
Christine

7
与Dineshkumar Ponnusamy陈述的错误相同。请帮帮我
Deathrace'Nov

1
您何时需要使用TLBMP?通常在VS2015中,如果您只是从引用窗口中将引用添加到COM DLL,它将为您完成所有这些工作。
UuDdLrLrSs

20

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

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

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

2018年3月12日更新:与MSDN杂志的链接不再像2010年8月那样起作用。JasonClark的文章标题为“ .NET列:使用P / Invoke用C#调用Win32 DLL”。它已发布在2010年7月的《 MSDN杂志》上。在“返回器”有文章在这里的那一刻(格式是有限的)。整个《 MSDN杂志》 2010年7月发行点击这里(仅HCM格式,如何使用HCM文件的说明这里)。


有没有办法确保编译器将.dll放在输出文件夹中,即使它不是参考?
凯尔·德莱尼

1
@KyleDelaney我认为编译器无法做到这一点。我会考虑将copy或xcopy命令放入项目/解决方案的pre-build / post-build事件中。尽管它是手动的,但通常参考文献的更改不会太频繁,并且适当的测试套件应该可以解决您忘记更新在pre-build / post-build事件中执行的命令的情况。
曼弗雷德

谢谢回复!
凯尔·德莱尼

链接到文章已失效。
罗尔德

@Roald谢谢。是的,链接确实断开了。Microsoft仅在不​​同的URL上提供整个《 MSDN杂志》的HCM格式。Wayback Machine还具有HTML格式的文章快照,外观有些简化。我已经更新了答案以反映这一点,并且还从答案中删除了断开的链接。希望这可以帮助。
曼弗雷德

12

我使用了依赖项遍历器来检查dll具有的内部引用。原来这是需要VB运行时msvbvm60.dll的,并且由于我的开发箱没有安装该程序,所以我无法使用regsvr32进行注册。

这似乎是我目前的原始问题的答案。


就我而言,我必须删除尝试引用的项目的obj文件夹,然后重新构建该项目。
托卢

7

如果尝试引用x86 dll,请确保将编译器设置为x86。

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

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

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

这是我在C#中使用的内容:

“; Provider = Microsoft.ACE.OLEDB.12.0; Data Source =” + strFilePath +“;扩展属性='Excel 12.0 Xml; HDR =是'”;

...我遇到了错误

一旦将编译器切换到x86,它就可以工作


2

我只是遇到了这个问题,在用命令提示符修复它的所有解释之后,我发现如果直接将其添加到项目中,则只需在需要的每个页面上包含该库即可。


2

我在项目中导入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);

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


1

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


1

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

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

也许有某种包装纸 DLL,您实际上是在引用它,并且包含DLL导入。

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

此问题是因为您要添加的程序集仅针对x86x64处理器体系结构进行了定位和编译。

只需在Build- > Configuration Manager中将目标平台更改为x86x64


1

我需要在配置管理器中将架构从x64更改为x86,并将32位dll(C语言-pcProxAPI.dll)复制到此创建的新文件夹

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


这也是他对我的问题。
rogue39nin19年

但是如果默认不是x86还是x64?但是....“ Any Cpu”出现了...?
gumuruh

codeproject.com/articles/1160645/…如果您在此处复制32位dll,则任何cpu都可以正常工作
Boateng

1

当我尝试将刚刚用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)。


解决方案资源管理器>属性>配置属性
Yuresh Karunanayake

@gumuruh如果您的意思是“什么是clr?”,那么CLR是docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

我遇到了类似的问题。我试图将.net 2.0 dll的引用添加到.Net 1.1项目中。当我尝试添加.Net 1.1中已编译的.dll的早期版本时。它为我工作。


0

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

mscorlib.ni.dll中发生类型为'System.IO.FileNotFoundException'的第一次机会异常-Windows Phone

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


查看与参考有关的框架版本之间的差异-很多时候,使用较新的框架版本应该不会有所不同。
JHaps

0

编写Windows服务时出现此错误。我以管理员身份运行Visual Studio,以便我的后期构建命令将自动安装我的服务。我注意到,当我关闭所有内容并正常运行VS(不是以管理员身份运行)时,它使我可以添加引用而没有错误。

希望此解决方案对您有用。


0

通常,在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,甚至可能对其进行区分以确保没有非常重要的异常之处。


0

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

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


0

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

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

然后在安装程序项目(在应用程序文件夹中)中复制该dll文件并粘贴。


0
  1. 启动cmd.exe并键入:
  2. Regsvr32%dllpath%
  3. “%dllpath%”替换为您的dll路径
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.