سؤال

هل هناك طريقة لتعديل تجميعات .NET الموجودة دون اللجوء إلى أدوات الطرف الثالث؟وأنا أعلم ذلك بوستشارب يجعل هذا ممكنًا ولكني أجد أنه من الإسراف بشكل لا يصدق أن يقوم مطور PostSharp بشكل أساسي بإعادة كتابة وظائف الكل System.Reflection مساحة الاسم من أجل جعل التجميعات الموجودة قابلة للتعديل.

System.Reflection.Emit يسمح فقط بإنشاء تجميعات ديناميكية جديدة.ومع ذلك، فإن جميع فئات الإنشاء المستخدمة هنا ترث من فئات الانعكاس الأساسية (على سبيل المثال. TypeBuilder يرث من System.Type).لسوء الحظ، لا يبدو أن هناك طريقة لإجبار نوع موجود ومحمّل ديناميكيًا على إنشاء النوع.على الأقل، لا توجد طريقة رسمية مدعومة.

فماذا عن غير المدعومة؟هل يعرف أحد عن الأبواب الخلفية التي تسمح بتحميل التجميعات أو الأنواع الموجودة في فئات الإنشاء هذه؟

العقل، أنا لا البحث عن طرق لتعديل التجميع الحالي (هذا يمكن حتى يكون طلبًا غير معقول) ولكن فقط لتعديل التجميعات الموجودة المحملة من القرص.أخشى أنه لا يوجد شيء من هذا القبيل ولكني أود أن أسأل على أي حال.

وفي أسوأ الأحوال، سيتعين على المرء اللجوء إليها ildasm.exe لتفكيك الكود ومن ثم ilasm.exe لإعادة التجميع ولكن لا توجد سلسلة أدوات (اقرأ:قارئ IL) الموجود في .NET للعمل مع بيانات IL (أو هل يوجد؟).

/يحرر:

ليس لدي حالة استخدام محددة.أنا مهتم فقط بحل للأغراض العامة لأن تصحيح التجميعات الموجودة مهمة شائعة جدًا.خذ أدوات التعتيم على سبيل المثال، أو ملفات التعريف، أو مكتبات AOP (نعم، الأخيرة يستطيع تنفيذها بشكل مختلف).كما قلت، يبدو أنه من الإسراف بشكل لا يصدق أن نضطر إلى إعادة كتابة أجزاء كبيرة من البنية التحتية الموجودة بالفعل System.Reflection.


@وتد:

أنت على حق.ومع ذلك، لا توجد حالة استخدام محددة هنا.لقد قمت بتعديل السؤال الأصلي ليعكس هذا.أثار اهتمامي سؤال آخر حيث أراد السائل أن يعرف كيف يمكنه حقن التعليمات pop و ret في نهاية كل طريقة من أجل منع عاكس Lutz Roeder من إعادة هندسة كود المصدر (VB أو C#).

الآن، يمكن تحقيق هذا السيناريو باستخدام عدد من الأدوات، على سبيل المثال.PostSharp المذكورة أعلاه و ريفلكسل البرنامج المساعد لـ Reflector، والذي بدوره يستخدم سيسيل مكتبة.

بشكل عام، أنا غير راضٍ عن إطار عمل .NET.

@جويل:

نعم، أنا على علم بهذا القيد.شكرا على أية حال على الإشارة إلى ذلك، لأنه مهم.

@ماركسيداد:

ويبدو أن هذا هو النهج الوحيد الممكن.ومع ذلك، فإن هذا يعني أنه لا يزال يتعين عليك إعادة إنشاء التجميع الكامل باستخدام فئات الإنشاء، أليس كذلك؟أي.سيتعين عليك السير فوق التجميع بأكمله يدويًا.

حسنًا، سأنظر في ذلك.

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

المحلول

يمكنك استخدام MethodInfo.GetMethodBody().GetILasByteArray(), ، قم بتعديل ذلك، ثم قم بتوصيله مرة أخرى ميثودبويلدر.كريتيثودبودي ().

نصائح أخرى

يسمح لك Mono.Cecil أيضًا بإزالة الاسم الواضح من تجميع محدد وحفظه مرة أخرى كتجميع غير موقع.بمجرد إزالة الاسم الواضح من التجميع، يمكنك فقط تعديل IL الخاص بالطريقة المستهدفة واستخدام التجميع كما تفعل مع أي تجميع آخر.إليك الرابط لإزالة الاسم القوي مع سيسيل:

http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

بمجرد قيامك بإزالة الاسم الواضح، يمكنك فعل ما تريد بالتجميع.يتمتع!

قد يكون من المفيد تقديم حالة استخدام أكثر تحديدًا، وربما تكون هناك طرق أفضل لإصلاح مشكلتك من هذه.

في .NET 3.5، من الممكن إضافة أساليب ملحقة إلى فئات إطار العمل الموجودة، ربما يكون هذا كافيًا؟

نقطة واحدة مهمة:إذا كان التجمع وقعت, ، ستفشل أي تغييرات وسينتهي بك الأمر بلا جدوى.

يتم توقيع تجميعات .NET Framework، وكما قال جويل كوهورن، فإنك لن تنجح.

يمكنك تحميل التجميع باستخدام IronRuby، ومزج جميع الوظائف التي يمكن أن تحلم بها

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