الشرطية اعتمادا على إطار الإصدار في C#
-
03-07-2019 - |
سؤال
هل هناك أي preprocessor الرموز التي تسمح شيء مثل
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
أو طريقة أخرى للقيام بذلك ؟
المحلول
أنا لا أعتقد أن هناك أي محددة مسبقا 'preprocessor' الرموز.ومع ذلك يمكنك تحقيق ما تريد مثل هذا:
إنشاء تكوينات مختلفة من المشروع الخاص بك ، واحد عن كل نسخة من CLR كنت ترغب في تقديم الدعم.
اختر رمز مثل
VERSION2
,VERSION3
الخ.في CLR الإصدار.في كل التكوين ، تحديد رمز واحد المرتبطة به ، undefine جميع الآخرين.
استخدام هذه الرموز في الشرطية كتل.
نصائح أخرى
ليست هناك أي بني، ولكن هل يمكن أن العرض الخاصة بك.
لهذا السيناريو معينة، قد ترغب في تغليف المنطق في (على سبيل المثال) مجمع (قفل) فئة، بحيث لم يكن لديك #if
المنتشرة عبر كافة التعليمات البرمجية. بالطبع، إذا كنت تفعل سوى القليل من تأمين قد لا يكون يستحق عناء.
وأنا استخدم تكوينات و / أو مشاريع مختلفة لبناء لمجموعة متنوعة من المنصات - أي protobuf- يبني شبكة ل. NET 2.0 Framework 3.0، أحادية، CF 2.0، CF 3.5 باستخدام هذه الحيلة. رمز و#if
كتل بناء على رموز مختلفة للسيطرة على المنطق - لذلك، على سبيل المثال، BinaryFormatter
غير متوفر على CF، WCF
لا تتوفر إلا مع Framework 3.0، Delegate.CreateDelegate
ليس على CF 2.0، الخ
هل يمكن استخدام انعكاس للتحقق حيوي ما إذا كان نوع معين مثل ReaderWriterLockSlim يتوفر (بدلا من استخدام المعالج).
وهذا من شأنه أن تعطيك ميزة أنه يمكنك نشر نسخة واحدة من المنتج الخاص بك والمستخدمين وجود (أو تحديث ل) الصافي 3.5 ستستفيد من رمز الأمثل.
هل يمكن وضع هذا الرمز باستخدام / تحديد التبديل مترجم أ يدويا >. ثم إنشاء تكوينات بناء مختلفة لكل إصدار CLR المطلوب.
وإذا كان هذا هو كل ما يلزم القيام به، وأنا افترض أنك <م> قد م> استخدام Environment.Version، ولكن مثل <وأ href = "https://stackoverflow.com/questions/408908/conditional-compilation- اعتمادا على أساس الإطار-الإصدار في وج # 408923 "> حل ديفو، فإنه لا يبدو أن ترك الكثير من التعليمات البرمجية unneccessary هناك.