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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么調(diào)用 DLL 中的函數(shù)時(shí)需要“ref”關(guān)鍵字?

為什么調(diào)用 DLL 中的函數(shù)時(shí)需要“ref”關(guān)鍵字?

C#
胡子哥哥 2023-09-16 16:19:16
我試圖弄清楚為什么我需要使 DLLImport 函數(shù)的參數(shù)為“ref int XXX”,而不僅僅是“int XXX”。對(duì)于后者,這會(huì)導(dǎo)致“嘗試讀取或?qū)懭胧鼙Wo(hù)的內(nèi)存。這通常表明其他內(nèi)存已損壞?!?nbsp;問(wèn)題......但是當(dāng)我將“ref”添加到參數(shù)中......它工作得很好。例如:    [DllImport("someDLL.dll", CallingConvention = CallingConvention.StdCall)]         public static extern int SomeDLL_GetDevices(ref int devices);^ 以上作品    [DllImport("someDLL.dll", CallingConvention = CallingConvention.StdCall)]         public static extern int SomeDLL_GetDevices(int devices);^ 以上崩潰和燒傷我不是從 C# 及其編組方面進(jìn)行 C++ 調(diào)用的導(dǎo)出,因此如果有人可以解釋為什么一個(gè)有效而另一個(gè)無(wú)效,我將不勝感激。
查看完整描述

1 回答

?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊

上面ref int說(shuō)“被調(diào)用者期望一個(gè)指向 32 位整數(shù)的指針,而編組器期望它是一個(gè)托管指針”。

指向整數(shù)的托管指針和整數(shù)是兩個(gè)完全不同的東西。一種是指針大小的——通常是 64 位——另一種肯定是 32 位。一種是值,一種是描述從哪里獲取包含值的變量。它們不可互換,您需要正確使用。

如果您不清楚編組層為實(shí)現(xiàn)這一點(diǎn)而使用的約定,請(qǐng)?jiān)诰帉懜嗑幗M代碼之前弄清楚它。 您正在與一個(gè)不具有 C# 提供的類型安全或內(nèi)存安全的系統(tǒng)進(jìn)行交互,因此您需要確保保留運(yùn)行時(shí)的不變量。通常,運(yùn)行時(shí)會(huì)確保維護(hù)運(yùn)行時(shí)不變量,但您正在描述如何與運(yùn)行時(shí)之外的代碼進(jìn)行交互,因此請(qǐng)確保它是正確的。

嘗試一些東西直到它起作用并不是一個(gè)好技巧。如果繼續(xù)這樣做,您可能會(huì)引入崩潰、內(nèi)存泄漏和更微妙的錯(cuò)誤(即安全漏洞)。閱讀文檔、書籍或視頻,或者讓同事向您解釋,以便您了解其工作原理。然后您將能夠充滿信心地編寫 p/invoke 代碼,而不是猜測(cè)和希望。


查看完整回答
反對(duì) 回復(fù) 2023-09-16
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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