C# 无法加载DLL(找不到模块HRESULT:0x8007007E) 我有一个DLL库,其中有非托管C++ API代码,我需要在.NET 4应用程序中使用。但我尝试加载dll的每个方法都会出现错误:
无法加载DLL“MyOwn.DLL”:找不到指定的模块。(来自HRESULT的异常:0x8007007E) 我已经阅读并尝试了在互联网上找到的几种解决方案。什么都不管用 我尝试过使用以下方法:C# 无法加载DLL(找不到模块HRESULT:0x8007007E) 我有一个DLL库,其中有非托管C++ API代码,我需要在.NET 4应用程序中使用。但我尝试加载dll的每个方法都会出现错误:,c#,c++,dll,pinvoke,C#,C++,Dll,Pinvoke,无法加载DLL“MyOwn.DLL”:找不到指定的模块。(来自HRESULT的异常:0x8007007E) 我已经阅读并尝试了在互联网上找到的几种解决方案。什么都不管用 我尝试过使用以下方法: [DllImport("MyOwn.dll", CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs((UnmanagedType.I4))] public static extern Int32 MyPro
[DllImport("MyOwn.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
当我尝试以下操作时,当我运行这个示例(从下载的代码)时,它运行没有问题(使用的dll在bin/debug文件夹中)
我已将我的dll(以及它所依赖的所有文件)复制到我的bin文件夹中
我也尝试过这种方法,但得到了相同的错误:
[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int MyproIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
有什么建议吗?尝试输入dll的完整路径。
如果不起作用,请尝试将dll复制到system32文件夹中。确保您自己的dll的所有依赖项都存在于dll附近,或者在
system32
中,根据我在Windows上的记忆,dll的搜索顺序为:
C:\windows\system32或C:\windows\SysWOW64
(用于64位框上的32位进程)路径
环境变量读取此外,我还要检查DLL的依赖关系,Visual Studio提供的依赖关系步行器可以在这里帮助您,它也可以免费下载:打开fusion日志,请参阅以获取有关如何执行此操作的大量建议。调试混合模式应用程序加载问题可能是一个正确的选择。fusion日志记录可以提供很大帮助。您可以使用dumpbin工具查找所需的DLL依赖项:
dumpbin /DEPENDENTS my.dll
这将告诉您需要加载哪些DLL。特别注意MSVCR*.dll。当没有安装正确的VisualC++重新分发时,我看到您的错误代码。
可以从微软网站获得VisualStudio 2013的“VisualC++ C++可再分发包”。它安装c:\windows\system32\MSVCR120.dll
在文件名中,120=12.0=Visual Studio 2013请注意,对于DLL的目标平台,您有正确的Visual Studio版本(10.0=VS 10,11=VS 2012,12.0=VS 2013…)和正确的体系结构(x64或x86),并且在调试构建时也需要小心。DLL的调试生成依赖于MSVCR120d.DLL,它是库的调试版本,它与Visual Studio一起安装,但不是通过可再发行的软件包安装的。请确保将生成平台目标设置为x86或x64,以便它与您的DLL兼容-该DLL可能是为32位平台编译的。如果DLL和.NET项目位于同一解决方案中,并且每次都要编译和运行它们,您可以右键单击.NET项目的属性“生成事件”,然后将类似以下内容添加到生成后事件命令行:
copy $(SolutionDir)Debug\MyOwn.dll .
它基本上是一个DOS行,您可以根据DLL的构建位置进行调整。我认为您的非托管库需要一个清单。
如何将其添加到二进制文件中。这就是为什么
总之,您的机箱中可以安装多个可再发行库版本,但其中只有一个版本应满足您的应用程序的要求,并且可能不是默认版本,因此您需要告诉系统您的库需要的版本,这就是清单的原因。我在将应用程序部署到测试PC时遇到了相同的问题。问题是开发PC有
msvcp110d.dll
和msvcr110d.dll
,但测试PC没有
我在VisualStudioSHILD中添加了VisualStudioC++ 11调试工具(X86)合并模块,并运行了。希望这对其他人有帮助。DLL必须位于bin文件夹中。
在VisualStudio中,我将dll添加到项目中,而不是在引用中,而是“添加现有文件”。然后将dll的“复制到输出目录”属性设置为“更新时复制”。安装程序:32位Windows 7 上下文:安装了PCI-GPIB驱动程序,由于上述问题,我无法通过该驱动程序进行通信 简短回答:重新安装驱动程序 长答案: 我还使用了,它识别了几个缺失的依赖模块。立刻,我想这一定是一个拙劣的驱动程序安装。我不想检查和恢复每个丢失的文件 我在控制面板的“程序和功能”下找不到卸载程序,这是安装不好的另一个迹象。我不得不手动删除\system32中的两个*.dll和注册表项,以便重新安装驱动程序 问题已解决
意外的是,并非所有依赖项模块都已解析。不过,现在可以引用感兴趣的*.dll了。有一件非常有趣的事情(并且与技术相关),它可能会浪费您的时间,所以请考虑在这里共享它- 我创建了一个控制台应用程序项目
ConsoleApplication1
和一个类库项目ClassLibrary1
生成p/invoke的所有代码都出现在ClassLibrary1.dll
中。因此,在VisualStudio调试应用程序之前,我只需将C++非托管程序集(<代码> MyunMadieDeals.DLL )复制到控制台应用程序1
的\bin\debug
目录中,该目录通常是win表单、控制台或web应用程序
因此,请注意,公认答案中的Current Directory
实际上是指您从中访问的主可执行文件的Current Directory
[DllImport(@"C:\\mycompany\\MyDLL.dll")]