无法添加对dll的引用

时间:2010-08-11 08:50:07

标签: .net wcf reference

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

  

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

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

  

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

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

感谢任何提示/回复

17 个答案:

答案 0 :(得分:50)

以下对我有用:

简短回答

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

答案 1 :(得分:17)

只有当它是.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 / Invoke”。它发表在2010年7月的MSDN杂志上。 “Wayback Machine”目前有文章here(格式有限)。 2010年7月的整个MSDN杂志问题可用here(仅限HCM格式,有关如何使用HCM文件的说明here)。

答案 2 :(得分:12)

我使用了依赖walker来查看dll所具有的内部引用。原来它需要VB运行时msvbvm60.dll,因为我的开发盒没有安装,我无法使用regsvr32注册它

这似乎是我原来问题的答案。

答案 3 :(得分:7)

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

我遇到了类似的问题......如上所述,尝试使用OLEDB从Visual Studio 2012中的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就可以了

答案 4 :(得分:2)

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

答案 5 :(得分: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);

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

您无法添加对原生 DLL的引用。但是,您可以将它们包含在解决方案中(右键单击解决方案,选择"添加现有文件"),但除非您声明类似

之类的内容,否则不会引用它们
[DllImport("...")]
public static extern void MyFunction();

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

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

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

尝试在构建 - >中将目标平台更改为 x86 x64 配置管理器

答案 8 :(得分:0)

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

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

一般来说,你必须绝对肯定你满足了所有参考的要求 - 我知道这是明显的答案,但你可能忽略了一个相对简单的要求。

答案 9 :(得分:0)

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

希望此解决方案适合您。

答案 10 :(得分:0)

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

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

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

对于一个示例,我建议创建一个新的解决方案作为C ++ CLR项目并检查那里的XML,甚至可以将其区分开以确保没有什么非常重要的。 / p>

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

C:\项目.. \ BIN \ 86 \调试

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

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

因为我要在其中使用该dll的项目也进行了这样的设置(将相同的属性设置为/clr)。

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

  1. 启动cmd.exe并输入:
  2. Regsvr32%dllpath%
  3. 将“%dllpath%”替换为您的dll路径