我有一個本地DLL下面的函數頭:元帥爲unsigned char *從DLL返回功能,在C#
unsigned char* Version_String()
我想從C#項目稱呼它,我已經試過下面的調用(如在其他類似的問題在這裏找到):
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
,我不斷收到以下異常:
試圖讀取或寫入PROT記憶。這通常表明其他內存已損壞。
下一個嘗試是下面的,我也得到了同樣的異常:
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
我似乎無法來解決這個問題。任何幫助將不勝感激!
編輯:
我不能在這裏給DLL的代碼,因爲它屬於的NDA,但功能我打電話看起來像這樣:
unsigned char versionString[50];
__declspec(dllexport) unsigned char* Version_String()
{
if(check_hardware_stuff())
{
strcpy((char *) versionString, "version_string_bla_bla");
versionString[5] = stuff;
}
else if (other_check())
{
//will return empty string, that should be filled with '\0'
}
else
{
strcpy((char *) versionString, "ERROR");
}
return versionString;
}
我不是特別喜歡DLL的實現,但我需要「實際上」使用它。 無論我如何處理返回值,只要我嘗試撥打VersionString()
,就會得到異常。
也許你正在使用錯誤的[調用約定](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx)? – svick
你的DLL是用MultiByte字符集選項編譯的嗎? –
使用調試器找出本機代碼崩潰的位置。項目+屬性,調試,勾選「啓用非託管代碼調試」。在C源代碼文件中設置函數的斷點。 –