簡體   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