当我在C#应用程序中将.dll文件添加为引用时,它显示错误:
无法添加对“ .... dll”的引用。请确保可访问该文件,并且该文件是有效的程序集或COM组件。
ILDissassembler说没有有效的CLR标头,所以我尝试使用regsvr32注册它,这给了我另一个错误:
已加载模块“”,但对DLLRegisterServer的调用失败,错误代码为“ 0x80004005”
我在64位Windows 7计算机上使用VS2010最终版本。可能是什么问题呢?
感谢您的任何提示/回复
Answers:
以下为我工作:
简短答案
通过命令行(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 : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.
什么建议吗?
仅当它是.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文件的说明这里)。
如果尝试引用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,它就可以工作
我在项目中导入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);
您可以将其添加到单独的项目中,然后从您的主项目中添加引用。
在构建解决方案期间重新启动PC后,出现了这个问题。我的两个引用都消失了,所以我不得不手动重建两个项目,然后可以添加引用而不会出错。
您不能添加对本机 DLL 的引用。但是,您可以将它们包括在解决方案中(右键单击解决方案,选择“添加现有文件”),但是除非您声明以下内容,否则不会引用它们
[DllImport("...")]
public static extern void MyFunction();
也许有某种包装纸 DLL,您实际上是在引用它,并且包含DLL导入。
有时,您可以引用包装DLL,但仍然无法使程序运行,错误提示会建议您确保文件存在并且所有依赖项都可用。
此问题是因为您要添加的程序集仅针对x86或x64处理器体系结构进行了定位和编译。
只需在Build- > Configuration Manager中将目标平台更改为x86或x64。
我需要在配置管理器中将架构从x64更改为x86,并将32位dll(C语言-pcProxAPI.dll)复制到此创建的新文件夹中。
C:\ Projects .. \ bin \ x86 \ Debug
当我尝试将刚刚用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
)。
对于在此问题上寻求帮助或遇到FileNotFoundException或FirstChanceException的其他任何人,请在此处查看我的答案:
mscorlib.ni.dll中发生类型为'System.IO.FileNotFoundException'的第一次机会异常-Windows Phone
通常,您必须绝对确定自己满足参考的所有要求-我知道这是显而易见的答案,但是您可能忽略了一个相对简单的要求。
通常,在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,甚至可能对其进行区分以确保没有非常重要的异常之处。