2017-10-12 72 views
1

我有一個函數在一個DLL中具有以下標識符。C#編組一個const char *從DLL的返回值

const char* function(void) 

DLL在堆上分配字符串,並期望它只被讀取。我曾嘗試以下導入功能,但我得到一個訪問衝突

[DllImport("great.dll", CharSet = CharSet.Ansi, 
         CallingConvention = CallingConvention.Cdecl) 
] 
public static extern string function(); 

如何處理這個正確

錯誤消息:

System.AccessViolationException:「試圖讀取或寫保護的內存。這往往表明其他內存已經損壞。「

+0

封送拆分器假定DLL在COM堆上分配了字符串,因此在返回的指針上調用CoTaskMemFree。顯然,DLL沒有這樣做。問題是,該字符串是如何分配的?在繼續之前,您需要了解這一點。 –

+0

我不這麼認爲。但是,如果它足夠適合你。 –

+1

另請參閱https://docs.microsoft.com/zh-cn/dotnet/framework/interop/default-marshaling-for-strings –

回答

2

就問題 「」與相同參數類型等功能的文字,我已經能夠使用[的MarshalAs(UnmanagedType.LPStr)來處理它,但是這不會對返回值工作」

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshalasattribute?view=netframework-4.7

//Applied to a return value. 
[return: MarshalAs(UnmanagedType.LPWStr)] 
    public String GetMessage() 
    { 
     return "Hello World"; 
    } 

更新引用這一點:保持這種情況下,它是爲別人尋找有關有幫助‘的MarshalAs’和返回值,因爲這個問題筆者已經解決了他們的問題,因爲他們 以上評論

+0

順便說一句,你知道http://www.pinvoke.net/網站? –

+0

這是驚人的。三個完全廢話的upvote。你已經在你用C#實現的函數上應用了MarshalAs?做體面的事情,並刪除這個來保存你的臉紅。 –

+0

你有沒有想過,有人可能會從本機代碼端與這個C#方法交談? (說回調或直接調用它?)。更有趣的是你沒有注意到這是微軟的示例代碼,而不是我的,原來問題的答案實際上是關於「[return:...]」的,因爲問題是提到能夠使用MarshalAs,但不與返回值。在批評之前請仔細閱讀 –