亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

為什么調用 DLL 中的函數時需要“ref”關鍵字?

為什么調用 DLL 中的函數時需要“ref”關鍵字?

C#
胡子哥哥 2023-09-16 16:19:16
我試圖弄清楚為什么我需要使 DLLImport 函數的參數為“ref int XXX”,而不僅僅是“int XXX”。對于后者,這會導致“嘗試讀取或寫入受保護的內存。這通常表明其他內存已損壞?!?nbsp;問題......但是當我將“ref”添加到參數中......它工作得很好。例如:    [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# 及其編組方面進行 C++ 調用的導出,因此如果有人可以解釋為什么一個有效而另一個無效,我將不勝感激。
查看完整描述

1 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

上面ref int說“被調用者期望一個指向 32 位整數的指針,而編組器期望它是一個托管指針”。

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

如果您不清楚編組層為實現這一點而使用的約定,請在編寫更多編組代碼之前弄清楚它。 您正在與一個不具有 C# 提供的類型安全或內存安全的系統進行交互,因此您需要確保保留運行時的不變量。通常,運行時會確保維護運行時不變量,但您正在描述如何與運行時之外的代碼進行交互,因此請確保它是正確的。

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


查看完整回答
反對 回復 2023-09-16
  • 1 回答
  • 0 關注
  • 128 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號