DLLImport كثافة العمليات ** - كيفية القيام بذلك إذا كان يمكن القيام به
سؤال
وأنا أحاول أن استخدام 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 لمساعدتك في التحويلات مثلا من عدد صحيح ** غير المدارة لمجموعة تمكنت ^> ^
لا تنتمي إلى StackOverflow