C# importing C++ dll
本文关键字:dll C++ importing | 更新日期: 2023-09-27 18:07:01
我有一个托管dll文件,它从c++ dll导入函数到托管环境。我在程序中使用了它的一些函数,但问题是,当我使用它时,我得到了这个错误:
无法加载DLL 'Libraries'lib.dll':无法找到指定的模块。(Exception from HRESULT: 0x8007007E)
我把.dll文件放在程序的目录和system32文件夹中。然而,它仍然不起作用。我想我必须使用DLLImport,但我不知道如何使用它…即使看了一些例子,我仍然感到困惑。有人能帮我一下吗?
你说:
我把。dll文件放在程序的目录下…
但:
无法加载DLL 'Libraries'lib.dll'
我们需要看到您的DLLImport
属性创建,即本机方法的c#签名。在我看来,您可能指定了路径,例如
[DllImport( "Libraries'lib.dll" )];
static extern void MyNativeMethod();
试着用这个代替:
[DllImport( "lib.dll" )];
static extern void MyNativeMethod();
将搜索运行目录以及通过您的PATH
环境变量。如果你指定了一个文件路径,我真的不知道如果没有找到文件,它是否会通过PATH
搜索(我在文档中找不到它)。
这里没有足够的信息来帮助您,因为您没有显示您试图导入的API(本机代码),等等。
话虽如此,我强烈建议阅读平台调用教程以及MSDN上的平台调用。他们介绍了主要问题,并展示了如何从c++ DLL导入和使用函数的许多示例。
在c#中使用c++ dll文件的最佳和最简单的方法:-
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();
}
}
}
如果您确定导出(使用依赖walker来检查)并且您已经使用正确的PInvoke调用正确地映射了它们,那么您的问题可能是32/64位相关的,特别是如果您在64位操作系统上使用。net应用程序设置为任意CPU。
当使用PInvoke时,32位的本机DLL只能由32位的。net进程加载(同样适用于64位本机DLL)。
您可以使用Properties->Build-> platform target来更改平台目标,或者您可以使用CorFlags实用程序。
我在不同的。dll文件中遇到了同样的问题,解决方案是将目标更改为x64而不是x86