当我在C#应用程序中添加.dll文件作为引用时,它显示错误:
无法添加对“.... dll”的引用 . 请确保该文件是可访问的,并且它是有效的程序集或COM组件 .
ILDissassembler说没有有效的CLR头,所以我尝试使用regsvr32注册它,这给了我另一个错误:
模块“”已加载,但对DLLRegisterServer的调用失败,错误代码为“0x80004005”
我在64位Windows 7机器上使用VS2010终极版 . 可能是什么问题呢?
感谢您的任何提示/回复
在构建解决方案期间重新启动PC后,我遇到了这个问题 . 我的两个引用都没了,所以我不得不手动重建我的两个项目,然后我可以添加引用而不会出错 .
我在编写Windows服务时遇到此错误 . 我以管理员身份运行Visual Studio,以便我的post build命令会自动安装我的服务 . 我注意到当我关闭所有内容并正常运行VS(不是管理员)时,让我添加引用就好了没有错误 .
希望这个解决方案适合您 .
对于其他寻求此问题帮助,或遇到FileNotFoundException或FirstChanceException的人,请在此处查看我的答案:
A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll - windows phone
一般来说,你必须绝对肯定你满足了所有参考的要求 - 我知道这是明显的答案,但你可能忽略了一个相对简单的要求 .
以下对我有用:
Short answer
通过命令行(cmd)运行以下命令:
TlbImp.exe cvextern.dll //where cvextern.dll is your dll you want to fix.
并将为您创建一个有效的DLL .
Longer answer
打开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 cvextern.dll
只有当它是.NET程序集时,才能将DLL(或EXE)添加到项目中 . 如果不是,您将看到此错误消息 .
regsvr32还对DLL中的结构和导出函数做出了一些假设 . 我使用它已经有一段时间了,但它与注册COM服务器有关,因此需要提供某些入口点 . 如果regsvr32失败,则DLL不提供这些入口点,并且DLL不包含COM组件 .
您只有使用DLL的机会是像任何其他非.NET二进制文件一样导入它,例如当您使用某些Win32 API时 . 有一篇旧的MSDN杂志文章可能会有所帮助 . 有关获取文章的信息,请参阅以下更新 .
Update 12 March 2018: MSDN杂志的链接不再像2010年8月那样有效.Jason Clark的文章 Headers 为".NET Column: Calling Win32 DLLs in C# with P/Invoke" . 它发表在2010年7月的MSDN杂志上 . "Wayback Machine"目前有文章here(格式有限) . 2010年7月的整个MSDN杂志问题可用here(仅限HCM格式,有关如何使用HCM文件的说明here) .
我使用依赖walker来查看dll所具有的内部引用 . 原来它需要VB运行时msvbvm60.dll,因为我的开发盒没有安装,我无法使用regsvr32注册它
这似乎是我原来问题的答案 .
如果您尝试引用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就可以了
我刚刚遇到了这个问题,在用命令提示符修复它之后,我发现如果你直接将它添加到项目中,你可以简单地在每个页面上包含它所需的库
我在项目中导入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);
您可以将其添加到单独的项目中,然后从主项目添加引用 .
您无法添加对 native DLL的引用 . 但是您可以将它们包含在解决方案中(右键单击解决方案,选择"Add existing file"),但除非您声明类似的内容,否则不会引用它们
[DllImport("...")] public static extern void MyFunction();
也许有某种 wrapper DLL,你实际上是引用它并且包含DLL导入 .
有时,您可能引用包装器DLL,但仍然无法使您的程序运行,其中错误提示建议您确保文件存在且所有依赖项都可用 .
此问题是因为您尝试添加的程序集仅针对 x86 或目标进行编译 x64 处理器架构 .
只需尝试在 Build - > Configuration Manager 中将目标平台更改为 x86 或 x64 .
我遇到了类似的问题 . 我试图将.net 2.0 dll的引用添加到.Net 1.1项目中 . 当我尝试添加.Net 1.1的先前版本的.dll时 . 它对我有用 .
通常在Visual Studio 2015中,您应该从Visual Studio的模板中将dll项目创建为C - > CLR项目,但事实上您可以在技术上启用它:
在 Configuration Properties > General > Common Language Runtime Support 下找到的项目's configuration. It'中设置了关键属性 Common Language Runtime Support .
Configuration Properties > General > Common Language Runtime Support
Common Language Runtime Support
这样做时,VS可能不会更新'Target .NET Framework'选项(就像它应该的那样) . 您可以通过卸载项目,编辑your_project.xxproj文件以及添加/更新 Target .NET framework Version XML标记来手动添加它 .
Target .NET framework Version
对于一个示例,我建议创建一个新的解决方案作为一个C CLR项目并检查那里的XML,甚至可能会对它进行区分,以确保没有什么非常重要的与众不同 .
我需要在配置管理器中将x64从x64更改为x86并将我的32位dll(C语言 - pcProxAPI.dll)复制到此创建的新文件夹中 . 这是在"Sashus" below描述的步骤之上 .
C:\项目.. \ BIN \ 86 \调试
我的回答有点晚,但作为一个快速测试,请确保您使用的是最新版本的库 .
在我的情况下,更新一个引用另一个库的nuget库导致问题后,问题就消失了 .
当我尝试添加一个刚编码的dll时遇到了同样的问题 . 原来我需要设置我的dll来自的项目的属性:
Configuration Properties\General\Common Language Runtime Support: /clr
Configuration Properties\C/C++\General\Common Language RunTime Support: /clr
因为我想要使用这个dll的项目也是这样设置的(具有相同的属性设置为 /clr ) .
/clr
15 回答
在构建解决方案期间重新启动PC后,我遇到了这个问题 . 我的两个引用都没了,所以我不得不手动重建我的两个项目,然后我可以添加引用而不会出错 .
我在编写Windows服务时遇到此错误 . 我以管理员身份运行Visual Studio,以便我的post build命令会自动安装我的服务 . 我注意到当我关闭所有内容并正常运行VS(不是管理员)时,让我添加引用就好了没有错误 .
希望这个解决方案适合您 .
对于其他寻求此问题帮助,或遇到FileNotFoundException或FirstChanceException的人,请在此处查看我的答案:
A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll - windows phone
一般来说,你必须绝对肯定你满足了所有参考的要求 - 我知道这是明显的答案,但你可能忽略了一个相对简单的要求 .
以下对我有用:
Short answer
通过命令行(cmd)运行以下命令:
并将为您创建一个有效的DLL .
Longer answer
打开cmd
找到TlbImp.exe . 可能位于C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin . 如果找不到它,请转到根文件夹(C:\或D :)并运行:
只有当它是.NET程序集时,才能将DLL(或EXE)添加到项目中 . 如果不是,您将看到此错误消息 .
regsvr32还对DLL中的结构和导出函数做出了一些假设 . 我使用它已经有一段时间了,但它与注册COM服务器有关,因此需要提供某些入口点 . 如果regsvr32失败,则DLL不提供这些入口点,并且DLL不包含COM组件 .
您只有使用DLL的机会是像任何其他非.NET二进制文件一样导入它,例如当您使用某些Win32 API时 . 有一篇旧的MSDN杂志文章可能会有所帮助 . 有关获取文章的信息,请参阅以下更新 .
Update 12 March 2018: MSDN杂志的链接不再像2010年8月那样有效.Jason Clark的文章 Headers 为".NET Column: Calling Win32 DLLs in C# with P/Invoke" . 它发表在2010年7月的MSDN杂志上 . "Wayback Machine"目前有文章here(格式有限) . 2010年7月的整个MSDN杂志问题可用here(仅限HCM格式,有关如何使用HCM文件的说明here) .
我使用依赖walker来查看dll所具有的内部引用 . 原来它需要VB运行时msvbvm60.dll,因为我的开发盒没有安装,我无法使用regsvr32注册它
这似乎是我原来问题的答案 .
如果您尝试引用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就可以了
我刚刚遇到了这个问题,在用命令提示符修复它之后,我发现如果你直接将它添加到项目中,你可以简单地在每个页面上包含它所需的库
我在项目中导入WinSCard.dll时遇到了同样的问题 . 我直接从dll处理导入,如下所示:
您可以将其添加到单独的项目中,然后从主项目添加引用 .
您无法添加对 native DLL的引用 . 但是您可以将它们包含在解决方案中(右键单击解决方案,选择"Add existing file"),但除非您声明类似的内容,否则不会引用它们
也许有某种 wrapper DLL,你实际上是引用它并且包含DLL导入 .
有时,您可能引用包装器DLL,但仍然无法使您的程序运行,其中错误提示建议您确保文件存在且所有依赖项都可用 .
此问题是因为您尝试添加的程序集仅针对 x86 或目标进行编译 x64 处理器架构 .
只需尝试在 Build - > Configuration Manager 中将目标平台更改为 x86 或 x64 .
我遇到了类似的问题 . 我试图将.net 2.0 dll的引用添加到.Net 1.1项目中 . 当我尝试添加.Net 1.1的先前版本的.dll时 . 它对我有用 .
通常在Visual Studio 2015中,您应该从Visual Studio的模板中将dll项目创建为C - > CLR项目,但事实上您可以在技术上启用它:
在
Configuration Properties > General > Common Language Runtime Support
下找到的项目's configuration. It'中设置了关键属性Common Language Runtime Support
.这样做时,VS可能不会更新'Target .NET Framework'选项(就像它应该的那样) . 您可以通过卸载项目,编辑your_project.xxproj文件以及添加/更新
Target .NET framework Version
XML标记来手动添加它 .对于一个示例,我建议创建一个新的解决方案作为一个C CLR项目并检查那里的XML,甚至可能会对它进行区分,以确保没有什么非常重要的与众不同 .
我需要在配置管理器中将x64从x64更改为x86并将我的32位dll(C语言 - pcProxAPI.dll)复制到此创建的新文件夹中 . 这是在"Sashus" below描述的步骤之上 .
C:\项目.. \ BIN \ 86 \调试
我的回答有点晚,但作为一个快速测试,请确保您使用的是最新版本的库 .
在我的情况下,更新一个引用另一个库的nuget库导致问题后,问题就消失了 .
当我尝试添加一个刚编码的dll时遇到了同样的问题 . 原来我需要设置我的dll来自的项目的属性:
Configuration Properties\General\Common Language Runtime Support: /clr
Configuration Properties\C/C++\General\Common Language RunTime Support: /clr
因为我想要使用这个dll的项目也是这样设置的(具有相同的属性设置为
/clr
) .