كيفية لف وظيفتي C ++ غير المُدارة في وظيفتين C# المدير؟

StackOverflow https://stackoverflow.com/questions/2777937

سؤال

لديّ وظيفتان غير مُدارة C ++ ، Compress و Decompress. الحجج والعوائد تذهب كما يتبع:

شار غير موقعة* Compress (char غير موقعة*، int)

شار غير موقعة* Decompress (char غير موقعة*، int)

حيث جميع الأشرار هي صفائف من Uchars.

هل يمكن لشخص ما مساعدتي في وضع طريقة لتحويلها إلى رمز C# المدارة باستخدام صفيف البايت [] بدلاً من Char*؟ شكرا جزيلا لك!

هل كانت مفيدة؟

المحلول

يجب أن تكون قادرًا على تمرير المعلمة char* غير الموقعة في كبايت [] و P/invoke Marshaller يجب أن تتعامل مع ذلك. سيتعين عليك تنشئة الإخراج غير الموقّع* بنفسك ، ولكن يجب أن يكون ذلك مجرد دعوة إلى marshall.copy (). انظر أدناه للحصول على مثال على ما أعتقد أنه سيعمل.

سؤالان كبيران:

  1. كيف يعرف المتصل حجم البيانات المخزنة في العازلة العازلة غير الموقعة؟
  2. كيف يتم تخصيص الذاكرة للعودة العازلة غير الموقعة؟ هل يجب عليك تحريره وكيف ستحرره من 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;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top