سؤال

أحتاج إلى استدعاء dll خارجي من c#.هذا هو تعريف الرأس:

enum WatchMode { 
   WATCH_MODE_SYSTEM = 0,          
   WATCH_MODE_APPLICATION  = 1 };  

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

لقد أضفت التعداد والمكالمة في C#:

public enum WatchMode
{
    WATCH_MODE_SYSTEM = 0,
    WATCH_MODE_APPLICATION = 1       
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

يؤدي هذا إلى إنشاء AccessViolationException.أعلم أن ملف dll "يعمل" لأنني أضفت أيضًا مكالمة إلى GetHandle الذي يعود hHandle المذكور أعلاه.لقد حاولت تغيير المعلمة إلى int (ref int watchmode) ولكن الحصول على نفس الخطأ.هل يعرف أحد كيف يمكنني استدعاء المكالمة المذكورة أعلاه؟

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

المحلول

أنت تواجه مشكلة اختلاف حجم المعلمة بين C# وC++.في عالم C++/windows LONG هو عدد صحيح موقّع مكون من 4 بايت.في عالم C#، يوجد عدد صحيح موقّع يبلغ 8 بايت.يجب عليك تغيير توقيع C# الخاص بك للحصول على int.

ffpf مخطئ في قوله أنه يجب عليك استخدام IntPtr هنا.سيتم إصلاح هذه المشكلة بالتحديد على جهاز 32 بت نظرًا لأن IntPtr سوف يقوم بتنظيم int.إذا قمت بتشغيل هذا على جهاز 64 بت، فسيتم تنظيمه كعدد صحيح موقّع بـ 8 بايت مرة أخرى وسوف يتعطل.

نصائح أخرى

قام فريق Managed وNative وCOM Interop بإصدار PInvoc Interop Assistant على codeplex.ربما يمكنه إنشاء التوقيع المناسب.http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120

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