Ing*_*son 105 c# c++ dll pinvoke
我有我需要在我的.NET 4.0应用程序中使用的非托管C++ API代码的DLL库.但我尝试加载我的DLL的每个方法都会出错:
无法加载DLL"MyOwn.dll":找不到指定的模块.(来自HRESULT的异常:0x8007007E)
我已阅读并尝试了我在互联网上找到的severa解决方案.什么都行不通..
我尝试过使用以下方法:
[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);
Run Code Online (Sandbox Code Playgroud)
当我尝试按照这篇文章和我运行这个例子时(从下载的代码中)它运行没有问题(使用的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);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
小智 87
根据我在Windows上的记忆,dll的搜索顺序是:
C:\windows\system32 or c:\windows\SysWOW64
(对于64位盒上的32位进程).Path
环境变量中读取另外我会检查DLL的依赖关系,Visual Studio提供的依赖walker可以帮助你在这里,它也可以免费下载:http://www.dependencywalker.com
Ant*_*ard 39
您可以使用dumpbin工具找出所需的DLL依赖项:
dumpbin /DEPENDENTS my.dll
Run Code Online (Sandbox Code Playgroud)
这将告诉您DLL需要加载哪些DLL.特别注意MSVCR*.dll.我已经看到在未安装正确的Visual C++ Redistributable时出现错误代码.
您可以从Microsoft网站获取"Visual Studio 2013的Visual C++ Redistributable Packages".它安装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一起安装,但不是由Redistributable Package安装.
Hea*_*ter 11
尝试输入dll的完整路径.如果它不起作用,请尝试将dll复制到system32文件夹中.
Jer*_*son 10
DLL必须位于bin文件夹中.
在Visual Studio中,我将dll添加到我的项目中(不是在引用中,而是"添加现有文件").然后将dll的"复制到输出目录"属性设置为"如果更新则复制".
“无法加载 DLL 'xxx.dll':找不到指定的模块。(HRESULT 异常:0x8007007E)”表示可以找到该文件,但无法加载它。尝试将 DLL 文件复制到应用程序的根文件夹中,应用程序的根文件夹中需要有一些 DLL 库才能使其正常工作。或者检查是否还有其他依赖它的DLL文件。
“ Cannot find DLL 'xxx.dll': ...”表示无法找到该文件。尝试检查路径。例如,[DllImport(@"\Libraries\Folder\xxx.dll")]
这是一个“麻烦”,但您至少可以使用它进行健全性测试:尝试在代码中对DLL的路径进行硬编码
[DllImport(@"C:\\mycompany\\MyDLL.dll")]
Run Code Online (Sandbox Code Playgroud)
话说回来; 在我的情况下,dumpbin /DEPENDENTS
按照@ anthony-hayward的建议运行,并将那里列出的DLL的32位版本复制到我的工作目录中,为我解决了这个问题。
该消息有点误导,因为它不是无法加载的“我的” dll-它是依赖项