簡體   English   中英

在C#應用程序中從非托管DLL導入功能

[英]Importing Function From Unmanaged DLL in C# Application

我需要將用C ++編寫的函數導入到C#應用程序中,該函數現在已編譯為DLL。 一切都建立在沒有錯誤或警告的情況下,但是當我逐步執行代碼時,對DLL的第一個函數調用將引發Exception並顯示一條消息“無法在DLL'WMIQuery.dll'中找到名為'CreateScanEngine'的入口點”。在我的C#應用​​程序中這樣聲明:

internal static class WMIQuery
{
    [DllImport("WMIQuery.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    internal static extern void CreateScanEngine();
}

Dependency Walker在DLL中顯示了該函數,如下所示:

序數:1(0x0001)
提示:0(0x0000)
函數^:void CreateScanEngine(void)
入口點:0x00001860

Dependency Walker還會顯示DLL的以下錯誤/警告:

錯誤:找不到至少一個必需的隱式或轉發依賴項。
警告:至少找不到一個延遲負載依賴性模塊。
警告:由於依賴於延遲負載的模塊缺少導出功能,因此至少一個模塊的導入無法解析。

這會有所作為嗎? 另外,我嘗試添加DLL作為對C#項目的引用,但出現此錯誤:

無法添加對[我的DLL]的引用。 請確保該文件可訪問,並且它是有效的程序集或COM組件。

有人知道我在做什么錯嗎? 謝謝。

不要使用Dependency Walker,它會破壞函數的導出名稱,並且不會告訴您真實的導出名稱。 請注意,它足夠聰明,可以看到它不帶參數且沒有返回值。 僅當看到由C ++編譯器修飾的名稱時,它才能執行此操作。

在DLL上使用Dumpbin.exe / exports查看真實名稱。 應為“?CreateScanEngine @@ YGXXZ”,使用[DllImport]屬性中的EntryPoint屬性。 您可能還想用extern“ C”聲明該函數,因此不會發生此名稱修改的情況。

您如何在C ++代碼中聲明CreateScanEngine?

嘗試更改為:

extern "C" __declspec(dllexport) void __stdcall CreateScanEngine();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM