【问题标题】:C# importing C++ dllC# 导入 C++ dll
【发布时间】:2011-11-06 03:08:49
【问题描述】:

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

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

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

【问题讨论】:

  • 介意告诉我你需要什么细节吗?
  • DLL 的名称。他们所在的位置。 DLLImport 语句。
  • @David,一些代码会有所帮助。
  • @Ben 好吧,这就是我想查看 DLLimport 语句的原因。
  • @David Heffernan,我的第一条评论是针对操作的

标签: c# c++ function dll import


【解决方案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】:

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

    话虽如此,我强烈建议您阅读 MSDN 上的 Platform Invoke Tutorial 和 A Closer Look at Platform Invoke。他们介绍了主要问题,并展示了许多如何从 C++ DLL 导入和使用函数的示例。

    【讨论】:

      【解决方案3】:

      在 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();
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2021-01-21
            • 1970-01-01
            • 2010-10-04
            • 1970-01-01
            • 1970-01-01
            • 2021-04-12
            • 1970-01-01
            • 2016-05-23
            • 1970-01-01
            相关资源
            最近更新 更多