سؤال

ولدي وظيفة التي تم تصديرها في ج ++ 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) ...

وإلقاء نظرة على هذه الصفحة:

http://dotnetperls.com/dllimport-interop

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