无法添加对dll的引用

use*_*358 92 .net wcf reference

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

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

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

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

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

感谢您的任何提示/回复

Mem*_*sen 52

以下对我有用:

简短的回答

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

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.
Run Code Online (Sandbox Code Playgroud)

并将为您创建一个有效的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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 运行tlbimp.exe并将你的dll放在它后面.示例:如果您的dll是cvextern.dll.你可以运行:

    TlbImp.exe cvextern.dll
    
    Run Code Online (Sandbox Code Playgroud)
  • 已在tlbimp.exe的同一文件夹中创建了一个新的dll.您可以在项目中将其用作参考.

  • @Memet Afer尝试这个我得到了,`TlbImp:错误TI0000:输入文件'c:\ Program Files\Microsoft SDKs\Windows\v7.0A\bin\MyLibrary.dll'不是有效的类型库.任何建议? (75认同)
  • 有Dineshkumar Ponnusamy所述的相同错误.请帮帮我 (7认同)
  • 访问TlbImp.exe的另一种方法是打开Visual Studio命令提示符. (5认同)

Man*_*red 18

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

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

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

2018年3月12日更新: MSDN杂志的链接不再像以前那样在2010年8月.Jason Clark的文章标题为".NET专栏:用P/Invoke调用C#中的Win32 DLL".它发表在2010年7月的MSDN杂志上."Wayback Machine" 此处有文章(格式有限).整个MSDN杂志发行2010年7月,请点击这里(仅HCM格式,如何使用HCM文件的说明这里).

  • @KyleDelaney 我不认为编译器可以做到这一点。我会考虑将 copy 或 xcopy 命令放入项目/解决方案的预构建/构建后事件中。虽然它是手动的,但通常引用不会经常更改,并且适当的测试套件应该捕获您忘记更新在构建前/构建后事件中执行的命令的情况。 (2认同)

use*_*358 12

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

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


小智 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就可以了