كيفية لف وظيفتي C ++ غير المُدارة في وظيفتين C# المدير؟
سؤال
لديّ وظيفتان غير مُدارة C ++ ، Compress
و Decompress
. الحجج والعوائد تذهب كما يتبع:
شار غير موقعة* Compress
(char غير موقعة*، int)
شار غير موقعة* Decompress
(char غير موقعة*، int)
حيث جميع الأشرار هي صفائف من Uchars.
هل يمكن لشخص ما مساعدتي في وضع طريقة لتحويلها إلى رمز C# المدارة باستخدام صفيف البايت [] بدلاً من Char*؟ شكرا جزيلا لك!
المحلول
يجب أن تكون قادرًا على تمرير المعلمة char* غير الموقعة في كبايت [] و P/invoke Marshaller يجب أن تتعامل مع ذلك. سيتعين عليك تنشئة الإخراج غير الموقّع* بنفسك ، ولكن يجب أن يكون ذلك مجرد دعوة إلى marshall.copy (). انظر أدناه للحصول على مثال على ما أعتقد أنه سيعمل.
سؤالان كبيران:
- كيف يعرف المتصل حجم البيانات المخزنة في العازلة العازلة غير الموقعة؟
- كيف يتم تخصيص الذاكرة للعودة العازلة غير الموقعة؟ هل يجب عليك تحريره وكيف ستحرره من C# إذا كنت بحاجة إلى ذلك؟
عينة:
[DllImport("Name.dll")]
private static extern IntPtr Compress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size);
[DllImport("Name.dll")]
private static extern IntPtr Decompress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size);
public static byte[] Compress(byte[] buffer) {
IntPtr output = Compress(buffer, buffer.Length);
/* Does output need to be freed? */
byte[] outputBuffer = new byte[/*some size?*/];
Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length);
return outputBuffer;
}
public static byte[] Decompress(byte[] buffer) {
IntPtr output = Decompress(buffer, buffer.Length);
/* Does output need to be freed? */
byte[] outputBuffer = new byte[/*some size?*/];
Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length);
return outputBuffer;
}
لا تنتمي إلى StackOverflow