第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用于返回char的C函數(shù)的PInvoke

用于返回char的C函數(shù)的PInvoke

C#
繁華開滿天機(jī) 2019-11-28 14:12:57
我正在嘗試編寫一些從非托管DLL調(diào)用方法的C#代碼。dll中的函數(shù)原型為:extern "C" __declspec(dllexport) char *foo(void);在C#中,我首先使用:[DllImport(_dllLocation)]public static extern string foo();它似乎在表面上起作用,但是在運(yùn)行時出現(xiàn)內(nèi)存損壞錯誤。我認(rèn)為我指的是碰巧是正確的但已經(jīng)被釋放的內(nèi)存。我嘗試使用稱為“ P / Invoke Interop Assistant”的PInvoke代碼生成實(shí)用程序。它給了我輸出:[System.Runtime.InteropServices.DLLImportAttribute(_dllLocation, EntryPoint = "foo")]public static extern System.IntPtr foo();它是否正確?如果是這樣,如何在C#中將此IntPtr轉(zhuǎn)換為字符串?
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊

您必須將此作為IntPtr返回。從PInvoke函數(shù)返回System.String類型需要非常小心。CLR必須將內(nèi)存從本機(jī)表示形式轉(zhuǎn)移到托管表示形式。這是一個容易且可預(yù)測的操作。


但是,問題在于如何處理從foo()返回的本機(jī)內(nèi)存。CLR假設(shè)以下兩個有關(guān)直接返回字符串類型的PInvoke函數(shù)的項(xiàng)目


本機(jī)內(nèi)存需要釋放

本機(jī)內(nèi)存是通過CoTaskMemAlloc分配的

因此,它將封送字符串,然后在本機(jī)內(nèi)存blob上調(diào)用CoTaskMemFree。除非您實(shí)際上使用CoTaskMemAlloc分配了此內(nèi)存,否則充其量只會導(dǎo)致應(yīng)用程序崩潰。


為了在這里獲得正確的語義,您必須直接返回IntPtr。然后使用Marshal.PtrToString *以獲得托管的String值。您可能仍然需要釋放本機(jī)內(nèi)存,但這將取決于foo的實(shí)現(xiàn)。


查看完整回答
反對 回復(fù) 2019-11-28
  • 2 回答
  • 0 關(guān)注
  • 487 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號