استدعاء نوع مخصص من DLL مكتوب في C ++ من C #
-
18-09-2019 - |
سؤال
أنا أستخدم DLL مكتوبة في C ++ في مشروعي C #. تمكنت من استدعاء الوظائف داخل DLL باستخدام هذا الرمز:
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
الآن أحتاج إلى استدعاء وظيفة تقوم بتثقيئة مؤشر نوع مخصص. المستندات لتخطيط DLL الوظيفة مثل هذا:
hid_get_info(int n,PDEV_INFO *pdi)
أنا لا أعرف كيفية استخدام هذا المؤشر المخصص. هل هذا محدد في DLL؟ إذا كان الأمر كذلك كيف يمكن استخدامه من مشروع C #؟ إذا لم يكن الأمر بحاجة إلى إدراج ملف الرأس في C #؟ شكرا مقدما لمساعدتكم.
المحلول
بالنظر إلى بادئة "P"، يبدو أن الإعلان الحقيقي هو
hid_get_info(int n, DEV_INFO **pdi)
حيث dev_info هي هيكل. ستحتاج إلى العثور على إعلان هذا الهيكل وإضافته إلى رمز C # الخاص بك مع سمة [Pluctlayout]. يمكنك بعد ذلك الإعلان عن الوظيفة مثل هذا في رمز C #:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
واستخدم marshal.ptrtostructure () للحصول على قيمة الهيكل. نأمل أن لا تضطر إلى تحرير الهيكل، وسوف تكون مشدود.
التفسير الثاني هو أن "PID" بإرجاع مجموعة من المؤشرات إلى هياكل dev_info. من المحتمل بعض الشيء أن تعطى الوسيطة "N"، والتي يمكن أن تعني أن عدد العناصر الموجودة في الصفيف التي تقوم بملءها بواسطة الوظيفة. في هذه الحالة، تمرير INTPTR [] وتعيين "N" إلى طوله.
نصائح أخرى
تحتاج إلى إنشاء struct
في C # التي تعكس C ++ PDEV_INFO
struct
في C ++.
يجب أن تنطبق [StructLayout(LayoutKind.Sequential)]
إلى الهيكل ثم انسخ الحقول من بنية C ++ (انظر إلى ملف الرأس) بالترتيب.
يمكنك بعد ذلك كتابة extern
الطريقة التي تأخذ struct
ك ref
معامل.
سوف نفترض بأمان PDEV_INFO*
هو DEV_INFO**
.
استخدم هذا في C #:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}