سؤال

يجب أن أقوم بتمرير InParameter من تطبيق C# الخاص بي إلى وظيفة مُصدَّرة من VC++ DLL.تقبل الدالة معلمتين:

int func_name (FILE* fp, BYTE& by);

fp موجود في و by هي خارج المعلمة.

كنت أفكر في التنظيم باستخدام IntPtr ل FILE* واستخدام بايت ل BYTE.هل هذا صحيح؟إذا كتبت ما يلي في C#

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

هل ستعمل؟أعتقد أنه سيعطي خطأً بالنسبة للعلامة "&" في بيان التنظيم.كيف يمكنني تمرير المعلمة حسب المرجع؟

سوف مساعدتكم سيكون محل تقدير كبير.

شكرا، فيرين

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

المحلول

إذا كانت الدالة الأصلية تتوقع مرجعًا، فيمكنك تنظيمها باستخدام المرجع/الخارج.لذا، في حالتك، يمكنك استخدام:out byte by.لقد قمت بفحصه، وهو يعمل بالنسبة لي.

تحرير مرة أخرى: لقد خطر في ذهني أن النصائح التي قدمتها لك لن تنجح، لأن FILE عبارة عن بنية، ولن تتمكن من تنظيمها من C# بهذه السهولة.لذا، اخدش هذه العناصر، ويمكنك استخدام هذا الأسلوب إذا كنت ستهدد SafeFileHandle ككائن HANDLE داخل مكتبتك غير المُدارة.إذا لم تتمكن من تعديل ملف dll هذا، فإن أحد الحلول هو إنشاء غلاف خاص لإنشاء الملفات باستخدام stdio، وقد يبدو كما يلي:

  1. إنشاء مكتبة تعرض وظائف fopen وfclose وما إلى ذلك.الحديد.(في ج++):
    FILE* CreateFile(char* name);
  2. Marhall هذه الوظيفة، في هذا المثال ستستخدم (c#):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. مارشال جميع معلمات FILE* إلى IntPtr، ثم قم بتمرير نتيجة الوظيفة فقط CreateMyFile كملف*.

نصائح أخرى

لا، لن يعمل هذا كما هو مكتوب.

  1. أين أنت ذاهب للحصول على FILE* في برنامج C#؟ما لم توفر لك وظيفة أخرى في ملف dll غير المُدار هذا المؤشر، فأنت في مشكلة.راجع للشغل أوصي بشدة التفاف هذا FILE* في SafeHandle;ثم سيستخدم توقيع p/invocation الخاص بك ملف SafeFilePointer بدلا من العارية IntPtr.
  2. كم عدد البايتات التي تقوم بتنظيمها؟إذا واحد فقط، ضع out byte by في التوقيع المُدار (لا توجد سمات مطلوبة).
  3. لا تحتاج إلى تحديد مجموعة محارف، لأنك لا تقوم بتنظيم أي منها charق أو stringس.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top