我有一个托管的dll文件,它将C++ dll的函数导入托管环境。我在我的程序中使用了它的一些功能,但问题是,当我使用它时出现此错误:C#导入C++的dll
无法加载DLL'Libraries \ lib.dll':无法找到指定的模块。 (来自HRESULT的异常:0x8007007E)
我将.dll文件放在程序的目录和system32文件夹中。但是,它仍然不起作用。我想我必须使用DLLImport,但我不知道如何使用它..即使看了一些例子,我仍然感到困惑。有人可以帮我吗?
我有一个托管的dll文件,它将C++ dll的函数导入托管环境。我在我的程序中使用了它的一些功能,但问题是,当我使用它时出现此错误:C#导入C++的dll
无法加载DLL'Libraries \ lib.dll':无法找到指定的模块。 (来自HRESULT的异常:0x8007007E)
我将.dll文件放在程序的目录和system32文件夹中。但是,它仍然不起作用。我想我必须使用DLLImport,但我不知道如何使用它..即使看了一些例子,我仍然感到困惑。有人可以帮我吗?
你说:
我把.dll文件在程序的目录...
但是:
无法加载DLL “库\ lib中。 dll'
我们需要看到您的DLLImport
属性创建,即本机方法的C#签名。它看起来像你对我可能指定路径,即
[DLLImport("Libraries\lib.dll")];
static extern void MyNativeMethod();
尝试使用这个:
[DLLImport("lib.dll")];
static extern void MyNativeMethod();
,将搜索的运行目录以及通过您的PATH
环境变量。如果你指定一个文件路径,我真的不知道它是否会通过PATH
搜索,如果没有找到该文件(我找不到在the docs中提到它)。
没有足够的信息在这里帮助,因为你没有显示的API(本机代码)你想导入等
话虽这么说,我强烈推荐阅读MSDN上的Platform Invoke Tutorial以及A Closer Look at Platform Invoke。他们介绍了主要问题,并展示了很多关于如何从C++ DLL导入和使用函数的例子。
如果您确定导出(使用dependancy walker进行检查)并且您已使用正确的PInvoke调用正确映射它们,那么您的问题可能与32/64位相关,尤其是如果您在64位操作系统上.NET应用程序设置为任何CPU。
使用PInvoke时,32位本机DLL只能由32位.NET进程加载(这同样适用于64位本机DLL)。
您可以使用Properties-> Build-> Platform target更改平台目标,也可以使用CorFlags实用程序。
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 = "[email protected]@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();
}
}
}
请详细说明。 –
介意告诉我你需要什么细节? – david
DLL的名称。他们在哪里。 DLLImport语句。 –