[英]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.