سؤال

ولدي C ++ البنية

struct UnmanagedStruct
{
   char* s;
   // Other members
};

ووC # البنية

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

وعلى C ++ يفضح مكتبة

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

ويتم استيراد عليه

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

ولكن عندما استدعاء هذه الدالة أحصل

وكان MarshalDirectiveException غير معالج

وتوقيع نوع الأسلوب ليست PInvoke متوافق.

والشيء هو، هذه الدعوة وظيفة يعمل إذا أزيل شار * الصورة وسلسلة الصورة من البنيات.

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

المحلول

لهذا النوع من السيناريو، لا تستخدم سلسلة مباشرة. بدلا من ذلك تبديل نوع أن تكون قيمة IntPtr واستخدام Marshal.PtrToStringAuto / الانسي / يوني حسب الاقتضاء. في هذه الحالة، لأن التعليمات البرمجية الأصلية يستخدم char*، PtrToStringAnsi هو الخيار الافضل.

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top