繁体   English   中英

C# 导入 C++ dll

[英]C# importing C++ dll

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

无法加载 DLL 'Libraries\lib.dll':找不到指定的模块。 (来自 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搜索(我在docs中找不到提及它)。

这里没有足够的信息来提供帮助,因为您没有显示您尝试导入的 API(在本机代码中)等。

话虽如此,我强烈建议阅读Platform Invoke Tutorial以及A Closer Look at Platform Invoke on 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();
        }
    }
}

我在使用不同的 .dll 文件时遇到了同样的问题,解决方案是将目标更改为 x64 而不是 x86

如果您确定导出(使用依赖遍历器检查)并且您已使用正确的 PInvoke 调用正确映射它们,那么您的问题可能与 32/64 位相关,特别是如果您在带有 .NET 应用程序的 64 位操作系统上设置为任何 CPU。

使用 PInvoke 时,32 位本机 DLL 只能由 32 位 .NET 进程加载(这同样适用于 64 位本机 DLL)。

您可以使用 Properties->Build->Platform target 更改平台目标,也可以使用CorFlags实用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM