无法添加对dll的引用

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

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

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

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

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

感谢任何提示/答复

以下为我工作:

简短的回答

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

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

和一个有效的DLL将为您创build。

较长的答案

  • 打开cmd

  • findTlbImp.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的相同文件夹中创build了一个新的dll。 你可以在你的项目中使用它作为参考。

只有在.NET程序集中,才能将DLL(或EXE)添加到项目中。 如果不是,你会看到这个错误消息。

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

你只有使用这个DLL的机会就像任何其他非.NET二进制文件一样导入它,比如当你使用某些Win32 API的时候。 这MSDN杂志文章可能会有所帮助。

我用依赖沃克检查了内部引用的DLL。 原来,这是需要VB运行时msvbvm60.dll,因为我的开发盒没有安装,我无法使用regsvr32注册

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

确保你的编译器设置为x86,如果你想引用一个x86 dll的话…

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

我不断得到关于Access库不能访问的错误,但我知道我已经加载它。

在debugging过程中,我发现我正在编译64位,但有Office x86加载。 即使我加载了32位的Access库,它从来没有被应用程序使用…因此,无法访问。

这是我在C#中使用的:

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

…我得到一个错误

只要我把编译器切换到x86,它就起作用了

我刚刚遇到了这个问题,并在所有关于解决与命令提示符的解释后,我发现,如果你直接添加到项目,你可以简单地将库包括在每个页面

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

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

我面临类似的问题。 我正在尝试添加.net 2.0 dll的引用到.net 1.1项目。 当我尝试添加在.net 1.1中编译的.dll的先前版本时。 它为我工作。

对于其他人在这个问题上寻求帮助,或遇到FileNotFoundException或FirstChanceException,请检查我的答案在这里:

mscorlib.ni.dll中出现“System.IO.FileNotFoundException”types的第一个机会exception – windows phone

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

在构build解决scheme期间,我的电脑已经重新启动后,我遇到了这个问题。 我的两个引用,所以我不得不手动重build我的两个项目,然后我可以添加引用没有错误。

编写Windows服务时出现此错误。 我以pipe理员身份运行Visual Studio,以便我的后期构build命令可以自动安装我的服务。 我注意到,当我closures一切,并正常运行VS(不是pipe理员),让我添加引用就好,没有错误。

希望这个解决scheme适合你。

通常在Visual Studio 2015中,您应该从Visual Studio的模板创build一个C ++ – > CLR项目的dll项目,但是事实上可以在技术上启用它:

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

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

举个例子,我build议创build一个新的解决scheme作为一个C ++ CLR项目,并在那里检查XML,甚至可以区分它以确保没有什么非常重要的东西。

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

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

也许有一些包装 DLL,你实际上是引用,其中包含DLL导入。

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

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

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

我需要在configurationpipe理器中将体系结构从x64更改为x86,并将我的32位dll(C语言 – pcProxAPI.dll)复制到创build的新文件夹中。这是“Sashus” 中描述的步骤的顶部。

C:\项目.. \ BIN \ 86 \debugging