DLLImport كثافة العمليات ** - كيفية القيام بذلك إذا كان يمكن القيام به

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن استخدام DLL طرف ثالث يريد عدد صحيح ** باعتبارها واحدة من المعلمات إلى الأسلوب. ويصف المعلمة على أنه عنوان للمؤشر من شأنها أن تشير إلى تخصيص الذاكرة.

ونعتذر عن أي التباس. المعلمة في اتجاهين على ما أعتقد. وDLL هو ليتحدث أمام مجلس FPGA وأسلوب هو إقامة نقل DMA بين أجهزة الكمبيوتر المضيفة ومجلس PCI.

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

المحلول

استخدم [ب-المرجع System.IntPtr .

 [DllImport("thirdparty.dll")]
 static extern long ThirdPartyFunction(ref IntPtr arg);

 long f(int[] array)
  { long retval = 0;
    int  size   = Marshal.SizeOf(typeof(int));
    var  ptr    = IntPtr.Zero;

    try 
     { ptr = Marshal.AllocHGlobal(size * array.Length);

       for (int i= 0; i < array.Length; ++i) 
        { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
          Marshal.StructureToPtr(array, tmpPtr, false);
        }

       retval = ThirdPartyFunction(ref ptr);
     }
    finally 
     { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
     }

    return retval;
  }

نصائح أخرى

وسيكون لديك للاستفادة من الطبقة المشير أو الذهاب غير آمنة في هذه الحالة.

وكما يمكن أن يكون مجرد مؤشر إلى صفيف، لذلك قد يعمل على ref int[] list.

وهناك كثافة ** سيكون ومجموعة من IntPtr، من وصفك أعتقد أنك قد ترغب في النظر في استخدام C ++ / CLI لمساعدتك في التحويلات مثلا من عدد صحيح ** غير المدارة لمجموعة تمكنت ^> ^

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top