DllImport وج ++ DLL في لC # التطبيق، BYTE * ص
سؤال
ولدي وظيفة التي تم تصديرها في ج ++ DLL
// C++ DLL (Blarggg.dll)
extern "C"
{
USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID )
{
if( invokeID != NULL ) {
* invokeID = 10 ;
}
return 0;
}
}
وهذا وأود أن جعلها متاحة لبلدي C # تطبيق
// C# app
[DllImport("Blarggg.dll")]
public static extern System.UInt16 ReadProperty(
/* [OUT] */ System.Byte[] message,
/* [IN] */ System.UInt16 length,
/* [OUT] */ System.Byte[] invokeID );
private void DoIt()
{
System.Byte[] message = new System.Byte[2000];
System.Byte[] InvokeID = new System.Byte[1];
System.UInt16 ret = ReadProperty( message, 2000, InvokeID ); // Error
}
والمشكلة هي أن أظل الحصول على رسالة الخطأ التالية.
<اقتباس فقرة>وحدث استثناء unhanded من نوع 'System.NullReferenceException' في Blarggg.dll معلومات إضافية: مرجع كائن لم يتم تعيين إلى مثيل كائن.
اقتباس فقرة>وأنا باستخدام VS2008 لبناء كل من DLL وC # التطبيق.
وأنا لست مبرمج C #.
وماذا أفعل الخطأ؟
المحلول
وأنا لصق الشفرة مباشرة في VS2008 وأنه يعمل تماما على الجهاز الخاص بي 32-بت (إضافة ملف .def لتعيين اسم المصدرة). هي مكتبة ++ C بك بالتأكيد مشروع Win32 ونقية؟ ويبدو أن رسالة الخطأ التي قدمت على أنها تعني أنه رمى استثناء CLR.
نصائح أخرى
وجرب هذا:
[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)]
public static extern System.UInt16 ReadProperty(
/* [IN] */ System.Byte[] message,
/* [IN] */ System.UInt16 length,
/* [OUT] */ out System.Byte invokeID );
private void DoIt()
{
System.Byte[] message = new System.Byte[2000];
System.Byte InvokeID;
System.UInt16 ret = ReadProperty( message, 2000, out InvokeID );
}
وقد تحتاج إلى استخدام في الطبقة System.Runtime.InteropServices.Marshal للتحويل بين أنواع المدارة وغير المدارة.
ويمكنك أن تفعل هذا مع أنواع C ++؟
وكنت تحت الانطباع بأنك يمكن فقط DLLImport C دلس.
ونحن نستخدم DLLImport مع غرامة C ++ دلل فقط ولكن نعلن وظائف الخارجية على النحو
extern "C" __declspec(dllexport) ...
وإلقاء نظرة على هذه الصفحة: