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,但我不知道如何使用它…即使看了一些例子,我仍然感到困惑。有人能帮我一下吗?

C# importing C++ dll

你说:

我把。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