سؤال

لاحظت في وثائق MSDN التي يوجد بها طرق متعددة لإعلان الإشارة إلى وظيفة في DLL خارجي من داخل برنامج VB.NET.

الشيء المربك هو أن MSDN يدعي أنه يمكنك فقط استخدام dllimportattribute. فئة مع النماذج النماذج الوظيفية المشتركة "في حالات نادرة"، لكنني لم أستطع العثور على شرح لهذا البيان، بينما يمكنك ببساطة استخدام Declare الكلمة الرئيسية بدلا من ذلك.

لماذا هذه مختلفة، وأين يمكنني استخدام كل حالة بشكل مناسب؟

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

المحلول

تعلن هو حقا محاولة للحفاظ على P / invoke. بناء الجملة الذي سيكون أكثر دراية للمستخدمين Visual Basic 6.0 للتحويل إلى vb.net.. وبعد لديها العديد من نفس الميزات مثل p / accoke ولكن تنظيم أنواع معينة، ولا سيما سلاسل، مختلفة جدا ويمكن أن تسبب القليل من الالتباس للناس أكثر دراية بقواعد دليلبورت.

أنا لست متأكدا تماما ما تظليل الوثائق مع التمييز "النادر". يمكنني استخدام DLLIMPORT في الكود الخاص بي بشكل متكرر من كل من VB.NET و C # دون إصدار.

بشكل عام، أود استخدام dllimport على إعلان ما لم أتيت من خلفية 6.0 Visual Basic. تكون الوثائق والعينات الخاصة ب Dllimport أفضل بكثير وهناك العديد من الأدوات التي تهدف إلى توليد إعلانات Dllimport.

نصائح أخرى

يبدو أن بيانات إعلان و Dllimport هي نفسها أساسا. يمكنك استخدام أيهما تفضله.

فيما يلي مناقشة النقاط القليلة التي قد تعمل بشكل مختلف قليلا في كل منها، والتي قد تؤثر على تفضيل واحد على الجانب الآخر:

لقد بدأت بمقال من MSDN بخصوص Visual Studio 2003 بعنوان باستخدام سمة Dllimport. وبعد (قديم قليلا، ولكن نظرا لأن بيان Dllimport قد نشأ في .NET، بدا أنه من المناسب العودة إلى البداية.)

إعطاء مثال بيان dllimport من:

[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption, unsigned int uType);

تقول أنه إذا تم استبعاد قيمة مغادرة Cler. سوف ابحث عن اسم الوظيفة (messageBox، في هذه الحالة) كإعداد افتراضي. ومع ذلك، في هذه الحالة، نظرا لأنه تم تحديد تجارة Unicode، فإن CLR ستبحث أولا عن وظيفة تسمى "MessageBoxW" - "W" تشير إلى نوع إرجاع Unicode. (سيكون إصدار نوع عودة ANSI "messageBoxa".) إذا لم يتم العثور على "messageBoxW"، فستبحث CLR عن وظيفة API تسمى فعلا "صندوق MessageBox".

يمكن العثور هنا على التفاصيل الحالية حول فئة DLLIMportattattribute هنا، حيث رأيت إصدار .NET Framework 4: dllimportattribute class.

التعليق المفتاح في قسم الملاحظات في صفحة .NET Framework 4 هذه هي:

يمكنك تطبيق هذه السمة مباشرة إلى تعريفات طريقة C # و C ++؛ ومع ذلك، فإن برنامج التحويل البرمجي Visual Basic ينبعث من هذه السمة عند استخدام عبارة Declare.

لذلك، على الأقل تتعلق vb.net، ينتهي المترجم مع Declare بيان على أي حال.

هناك أيضا ملاحظة مهمة في هذه الصفحة:

لا يدعم dllimportattribute حشو الأنواع العامة.

لذلك، يبدو أنه إذا كنت ترغب في استخدام نوع عام، فسيتعين عليك استخدام Declare بيان.

بعد ذلك، توجهت إلى معلومات بيان الإعلان. كان إصدار Visual Studio 2010 (معلومات بيان Visual Basic) هنا: إعلان البيان

عنصر المفتاح هنا كان هذا الملاحظة:

يمكنك استخدام إعلان فقط على مستوى الوحدة النمطية فقط. هذا يعني أن سياق الإعلان لمرجع خارجي يجب أن يكون فئة أو هيكل أو وحدة نمطية، ولا يمكن أن يكون ملف مصدر أو مساحة اسم أو واجهة أو إجراءات أو كتلة.

على ما يبدو، إذا كنت ترغب في إعداد مكالمة API خارج الفصل أو الهيكل أو الوحدة النمطية، فسيتعين عليك استخدام عبارة Dllimport بدلا من Declare.

المثال Declare بيان في هذه الصفحة هو:

Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA" (
  ByVal lpBuffer As String, ByRef nSize As Integer) As Integer

بعد هذا المثال هو هذه tidbit الصغير من المعلومات:

يوفر DLLIMPortattribute طريقة بديلة لاستخدام الوظائف في التعليمات البرمجية غير المدارة. المثال التالي يعلن وظيفة مستوردة دون استخدام بيان إعلان.

تليها، بالطبع، مثال على استخدام dllimport.

فيما يتعلق بنتائج Unicode vs ANSI، وفقا لصفحة الإعلان هذه، إذا قمت بتحديد قيمة شحن (متوفرة بالتعريف، ولكن لا تظهر في المثال أعلاه) ستقوم CLR بتحديد نفس النوع من البحث التلقائي الذي يفعله Dllimport - إما Unicode أو ANSI.

إذا كنت لا تحدد قيمة شحن في Declare بيان، ثم يجب عليك التأكد من أن اسم وظيفتك في الإعلان هو نفسه اسم الوظيفة في ملف رأس وظيفة API الفعلية، أو يجب عليك تحديد Alias القيمة التي تطابق اسم الوظيفة الفعلي في ملف الرأس (كما هو موضح في المثال أعلاه).

لم أتمكن من العثور على أي وثائق Microsoft محددة تفيد بأن dllimport أو يعلن مفضلة، أو حتى الموصى بها، أكثر من بعضها البعض في أي موقف آخر غير تلك المذكورة أعلاه.

استنتاجي، لذلك، هو:

1) ما لم تكن بحاجة إلى وضع تعريفك في أحد الأماكن Declare لا يمكن استخدام العبارة، إما أن تقنية تعمل بشكل جيد،

و

2) إذا كنت تستخدم Dllimport، فتأكد من تحديد قيمة Charset التي تريدها (Unicode أو ANSI)، أو قد تحصل على نتائج غير متوقعة.

في رأيي، نظرا لأن هذه الكلمة الأساسية لا تبدو محرومة، وما إلى ذلك. من ما بحثت فيه، ما عليك سوى استخدام الكلمات الرئيسية في تجميع الوقت بدلا من السمات.

أيضا، عند استخدام Declare, لا تحتاج إلى كتابة End Function. وبعد ميزة ذلك هي أنه يمكنك إنشاء وحدة نمطية كاملة من تصريحات سطر استيراد الوظائف حسب الخط، دون الحاجة إلى إلغاء الكود الخاص بك DllImportرمل End Functionس.

عندما تعلن باستخدام Declare الكلمة الأساسية، المترجم يعامل هذه الوظيفة كما Shared على أي حال، لذلك يمكن الوصول إليها عبر الكائنات البوستين الأخرى.

لكنني أفكر في VB.NET الحالي كلاهما موجه إلى نفس الهدف ولا فرق الأداء - لا ضمان على هذا واحد.

لذلك استنتاجي هو: هل تستخدم الإعلان بدلا من dllimport, ، وخاصة قراءة ما نقلت ذلك ذكرت مايكروسوفت أنه ينبغي استخدامه في حالات نادرة.

إذا كنت بحاجة إلى تعيين أحد الخيارات التالية، فاستخدم DllImportAttribute السمة، استخدام آخر Declare. وبعد من https://msdn.microsoft.com/en-us/library/w4byd5y4.aspx.

لتطبيق BestFitmapping، الاتصال، الدقة، المحفز، SetLasterRor، أو RightonNunMappableChar بإعلان Microsoft Visual Basic 2005، يجب عليك استخدام سمة Dllimportattattribute بدلا من بيان إعلان.

من غير الواضح من المرجع أعلاه فقط ما إذا كان هذا ينطبق على "Visual Basic 2005" فقط أو لا، كما هو المرجع أعلاه من مقالة .NET 4.5. ومع ذلك، وجدت أيضا هذه المقالة (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(v=vs.110).aspx. ) وهو محدد ل DllImportAttribute فئة في .NET 4.5:

ينبع برنامج التحويل البرمجي Visual Basic هذه السمة عند استخدام عبارة Declare. بالنسبة لتعريفات الطريقة المعقدة التي تشمل BestFitMapping أو الاتصال أو الملحق أو المحفز أو SetLasterRor أو RightonNunMappableChar، تقوم بتطبيق هذه السمة مباشرة على تعريفات طريقة Visual Basic.

هذا يخبرك أن Declare الخيار هو VB.NET السكر النحوي الذي يتم تحويله إلى DllImportAttribute في وقت الترجمة، وتحدد السيناريوهات الدقيقة عند استخدامها DllImportAttribute يوصى مباشرة.

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