簡體   English   中英

如何在用C#消耗的用C ++編寫的外部.dll資源上正確創建入口點

[英]How to properly create an entry point on an external .dll resource written in C++ consumed in C#

長期的讀者,第一次的海報。 我希望有一天能在這里回答問題...

因此,它類似於: “無法在dll中找到名為[function]的入口點”(從C ++到C#類型的轉換)

但是我似乎無法應用相同的解決方案...

基本上,我寫了一個新方法:

在C ++項目的頭文件中定義為:

extern "C" {
     __declspec(dllexport) bool IsDataValid();
}

在C ++項目的源文件中定義為:(僅簽名)

extern bool __cdecl IsDataValid() { 
//function stuf......... returns a bool
}

導入到C#項目內的Forms C#應用程序中的方式如下:

[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();

在C#表單.cs文件中的同一位置調用它,如下所示:

bool isDataValid = IsDataValid();

它返回一條異常消息:

“無法找到以DLL'CarChipSDK_C_Sharp.dll'命名的入口點'IsDataValid()'。

我已經在c ++代碼生成的.dll上使用了dumpbin.exe和依賴項walker,它表明它具有IsDataValid()入口點。

非常感謝所有幫助...

問題解決了! 愚蠢的我,這是我前任公司的代碼,原來他是從bin / release文件夾中讀取.dll的,當時是我正在構建的bin / debug文件夾。 應該知道。 誠摯的歉意。

您正在遇到C ++名稱修改。 將C ++函數聲明為外部“ C”。 因此,在您的C ++模塊中...

extern "C" __declspec(dllexport) bool IsDataValid();

您確實也不需要入口點規范屬性。 您的C#聲明將為:

[DllImport("CarChipSDK_C_Sharp.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();

供將來參考,dumpbin.exe是用於分析此類問題的非常有用的程序。 如果您在DLL上運行它,您將看到這些函數在編譯時實際上被命名了什么。

暫無
暫無

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

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