أنواع متوافقة مع CLS في P/Invoke Assembly Assembly
-
04-10-2019 - |
سؤال
امتلاك مجموعة مساعدة منفصلة تحتوي فقط على إعلانات P/Invoke لمكونات الطرف الثالث القديم ، أتساءل أي من هاتين الطريقتين هو أفضل واحد إذا كان يجب وضع علامة على CLS متوافقة:
- يستخدم
Int32
في عام P/استدعاء إعلان حيث كان الإعلان غير المدير الإدارةunsigned int
. - يستخدم
UInt32
في داخلي P/استدعاء إعلان حيث كان الإعلان غير المدير الإدارةunsigned int
, ، ولفها في أ عام الطريقة التي تأخذInt32
ويحولها إلىUInt32
عند استدعاء داخلي طريقة.
ما هي الجوانب الصاعدة والسلبية لهذه؟
المحلول
لن يشتكي P/Invoke Marshaller عندما تصبح UINT كبيرة جدًا ، فسوف ينتهي بك الأمر إلى int سلبية. الطبقة الإضافية تسمح لك باستخدام التحقق الكلمة الرئيسية لإنشاء فائض. وهو أمر مرغوب فيه إلى حد ما.
ما إذا كان الأمر يستحق المتاعب هو سؤال ثانوي. الكثير من واجهات برمجة التطبيقات ، مثل Win32 ، تستخدم غير موقعة ك منطقي قيد. مثل طول السلسلة أو حجم كتلة الذاكرة ، لا يمكن أن تكون سالبة أبدًا. في الممارسة العملية ، لا يمكن أن يفيض مثل هذا الرقم. لأنه لا يمكن تخصيص الكثير من الذاكرة. لا أستطيع أن أتذكر الركض مرة واحدة في واجهة برمجة التطبيقات حيث كان من الممكن استخدام uint. على هذا النحو ، أعتقد أنك بخير فقط باستخدام إعلان Pinvoke مباشرة مع INTS.
نصائح أخرى
لا أعتقد أنك ستحصل على السلوك الصحيح إذا ذهبت مع الخيار 1. لا يمكن أن تصل إلى 2،147،483،647 فقط. في حين أن INT غير موقعة تصل إلى 4،294،967،295. طالما أنك تعلم أنك لا تحتاج إلى أي قيم تزيد عن ملياري ، فهذا لا يهم حقًا. ولكن لكي تكون صحيحة من الناحية الفنية ، يجب أن تعرض الواجهة العامة نوعًا أكبر وأن تؤدي حدود للتأكد من أنها تتناسب مع int غير موقعة ورمي استثناء إذا لم يحدث ذلك. int64 سوف تفعل (9،223،372،036،854،775،807).