我試圖弄清楚為什么我需要使 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 代碼,而不是猜測和希望。
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報
0/150
提交
取消