C#导入C ++ DLL

时间:2011-08-29 15:29:32

标签: c# c++ function dll import

我有一个托管的dll文件,它将函数从C ++ dll导入托管环境。我在我的程序中使用了它的一些功能,但问题是,当我使用它时出现这个错误:

无法加载DLL'Libraries \ lib.dll':找不到指定的模块。 (HRESULT异常:0x8007007E)

我将.dll文件放在程序目录和system32文件夹中。但是,它仍然无效。我想我必须使用DLLImport但我不知道如何使用它..即使看了一些例子我仍然感到困惑。有人可以帮助我吗?

5 个答案:

答案 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