هل أحتاج إلى كتابة مكتبة IL غير المدارة الخاصة بي لإعادة كتابة IL باستخدام CLR Perfiling API؟

StackOverflow https://stackoverflow.com/questions/2269844

سؤال

لقد كنت أبحث في بعض المقالات الخاصة بآبار واجهة برمجة تطبيقات CLR ، والعديد من هذه المقالات تتحدث عن استدعاء setIlFunctionBody () للقيام بإعادة كتابة IL الفعلية ؛ ومع ذلك ، فإن أيا من هذه المقالات في الواقع يفسر بالضبط ما يمكنك استخدامه لإعادة كتابة الطريقة الفعلية بايت. هل هناك مكتبة غير مُدارة تسمح لي بكتابة IL ، أو هل يجب أن أكتب واحدة بنفسي؟

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

المحلول

من المحتمل. هذا يعتمد.

يحتوي مشروع Mono على مكتبة تسمى Cecil ، والتي يمكنك الوصول إليها هنا:

http://mono-project.com/cecil

ومع ذلك ، يتم إدارتها ، والتي لا يمكنك الاتصال بها أثناء التنميط. قد يكون لديك بعض الخيارات على الرغم من:

  1. استخدم IPC. يمكنك أن تفرخ عملية جديدة ، والقيام بإعادة كتابة باستخدام Cecil في تلك العملية ثم تمرير البايتات إلى البروفيل الخاص بك باستخدام أنابيب مسموح.
  2. Port Cecil إلى C ++. تم توزيع الكود بموجب ترخيص MIT / X11 ، بحيث يمكنك القيام بذلك دون الحاجة إلى مشاركة التغييرات الخاصة بك.
  3. فقط اكتب الأشياء الخاصة بك من الصفر.

#1 يقدم مجموعة من التعقيد الإضافي. سينتهي الأمر بتعبير أجزاء أكثر تحريكًا مما كان بحاجة إليه حقًا. أيضا ، يقدم IPC مجموعة من النفقات العامة الإضافية.

#2 سوف يستغرق وقتا طويلا. بالنظر إلى أن CECIL لا يزال في الإصدار 0.6 فقط ، فقد لا يكون الوقت يستحق الوقت للقيام بذلك ، مقابل كتابة تطبيقك الخاص.

#3 من شأنه أن يمنحك أكبر درجة من السيطرة ، وربما يكون أكثر الأداء. ومع ذلك ، سوف يستغرق الأمر جهد أكثر بكثير مما يستغرقه #1.

نصائح أخرى

لقد كتبت واحدة بسيطة لـ OpenCover https://github.com/sawilde/opencover التي قد تجدها أنت أو أي شخص آخر لهذه المسألة

قد يكون لهذا المقال ما تبحث عنهhttp://www.codeproject.com/kb/cs/il_rewriting.aspx

يجب أن تأتي البايتات الفعلية من مكان ما ، وإذا كنت تستخدم واجهة برمجة تطبيقات التنميط فقط ، فيجب عليك تزويدها بنفسك. يذهب هذا المقال المتعمق حول كيفية القيام بذلك (ربما أحد تلك التي قرأتها): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

تتمثل التقنية "الأكثر شيوعًا" في كتابة أي رمز تحتاجه في أي لغة تفضلها ثم تجميعها إلى IL. يمكنك بعد ذلك إما استخراج الرموز المطلقة في وقت التصميم وتخزينها حيث يمكنك الوصول إليها أو استخراجها من IL المترجمة في وقت التشغيل واطلبها حيث تحتاجها.

AFAIK لا توجد مكتبات غير مُدارة لمساعدتك في هذا.

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

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