我有一个托管的dll文件,它将函数从C ++ dll导入托管环境。我在我的程序中使用了它的一些功能,但问题是,当我使用它时出现这个错误:
无法加载DLL'Libraries \ lib.dll':找不到指定的模块。 (HRESULT异常:0x8007007E)
我将.dll文件放在程序目录和system32文件夹中。但是,它仍然无效。我想我必须使用DLLImport但我不知道如何使用它..即使看了一些例子我仍然感到困惑。有人可以帮助我吗?
答案 0 :(得分:2)
这里没有足够的信息来帮助您,因为您没有显示您尝试导入的API(在本机代码中)等。
话虽如此,我强烈建议您在MSDN上阅读Platform Invoke Tutorial以及A Closer Look at Platform Invoke。他们介绍了主要问题,并展示了如何从C ++ DLL导入和使用函数的许多示例。
答案 1 :(得分:1)
你说:
我将.dll文件放在程序的目录中......
可是:
无法加载DLL 'Libraries \ lib.dll'
我们需要查看您的DLLImport
属性创建,即本机方法的C#签名。在我看来,你可能会指定路径,即
[DLLImport( "Libraries\lib.dll" )];
static extern void MyNativeMethod();
请尝试使用此代码:
[DLLImport( "lib.dll" )];
static extern void MyNativeMethod();
这将搜索正在运行的目录以及您的PATH
环境变量。如果您指定文件路径,我真的不知道如果找不到该文件,它是否会搜索PATH
(我在the docs中找不到它。)
答案 2 :(得分:0)
如果您确定导出(使用dependancy walker进行检查)并且已使用正确的PInvoke调用正确映射它们,那么您的问题可能是32/64位相关,尤其是如果您使用的是64位将.NET应用程序设置为Any CPU的操作系统。
32位本机DLL只能在使用PInvoke时由32位.NET进程加载(同样适用于64位本机DLL)。
您可以使用Properties-> Build-> Platform target更改平台目标,也可以使用CorFlags实用程序。
答案 3 :(得分:0)
The best and easiest way of using a c++ dll file in c# :-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace demo1
{
class Program
{
[DllImport("shi.dll", EntryPoint = "?HelloWorld@@YAXXZ")]
public static extern int HelloWorld();
public static void Main(string[] args)
{
//Console.WriteLine(StringUtilities.HelloWorld());
Console.WriteLine(HelloWorld());
// public static extern void HelloWorld();
// HelloWorld();
// Console.ReadKey();
}
}
}
答案 4 :(得分:0)
我在使用不同的 .dll 文件时遇到了同样的问题,解决方案是将目标更改为 x64 而不是 x86