سؤال

هل تستخدم ILMerge?هل تستخدم ILMerge إلى دمج العديد من الجمعيات إلى سهولة نشر dll ؟ هل وجدت مشاكل مع النشر/الإصدارات في الإنتاج بعد ILMerging جمعيات معا ؟

أنا أبحث عن بعض النصائح في ما يتعلق باستخدام ILMerge للحد من نشر الاحتكاك ، إذا كان ذلك ممكنا حتى.

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

المحلول

يمكنني استخدام ILMerge تقريبا جميع التطبيقات المختلفة.لدي المتكاملة الحق في الإفراج عن بناء العملية إذا ما كنت في نهاية المطاف مع واحد exe في تطبيق اضافي dll.

لا يمكنك ILMerge أي C++ الجمعيات التي لديها التعليمات البرمجية الأصلية.كنت أيضا لا يمكن أن ILMerge أي الجمعيات التي تحتوي على XAML عن WPF (على الأقل أنا لم يكن لديك أي نجاح في ذلك).فهو يشكو في وقت أن الموارد لا يمكن أن يكون موجودا.

أنا لم أكتب المجمع للتنفيذ ILMerge حيث كنت تمر في بدء التشغيل exe اسم المشروع أريد أن دمج و الناتج exe اسم ومن ثم فإنه يعكس تعتمد الجمعيات المكالمات ILMerge المناسبة معلمات سطر الأوامر.هو أسهل بكثير الآن عند إضافة جديدة الجمعيات المشروع لا يجب أن تذكر لتحديث بناء السيناريو.

نصائح أخرى

مقدمة

هذا آخر يوضح كيفية استبدال جميع .exe + .dll files مع واحد combined .exe.فإنه يحتفظ أيضا التصحيح .pdb الملفات سليمة.

من أجل تطبيقات وحدة التحكم

هنا هو الأساسي Post Build String ل Visual Studio 2010 SP1 باستخدام .NET 4.0.أنا بناء وحدة التحكم .exe مع كل من sub-.dll الملفات المدرجة في ذلك.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

الأساسية تلميحات

  • الناتج هو ملف "AssemblyName.all.exe"الذي يجمع بين جميع الفرعية dlls في واحد .exe.
  • لاحظ ILMerge\ الدليل.تحتاج إلى نسخ ILMerge فائدة في الحل الخاص بك الدليل (حتى يمكنك توزيع المصدر دون الحاجة إلى القلق حول توثيق تثبيت ILMerge) ، أو تغيير هذا المسار إلى نقطة حيث ILMerge.exe يقيم.

المتقدمة تلميحات

إذا كان لديك مشاكل مع انه لا يعمل بدوره على Output, وحدد Show output from: Build.الاختيار الدقيق الأمر الذي Visual Studio فعلا ولدت ، و التحقق من الأخطاء.

عينة بناء السيناريو

هذا البرنامج النصي يستبدل كل .exe + .dll files مع واحد combined .exe.فإنه يحتفظ أيضا التصحيح .ملف pdb سليمة.

إلى استخدام لصق هذا في Post Build الخطوة تحت Build Events التبويب في مشروع C#, و تأكد من ضبط المسار في السطر الأول للإشارة إلى ILMerge.exe:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0

نحن نستخدم ILMerge على تطبيق Microsoft كتل بدلا من 12 منفصلة ملفات DLL, لدينا ملف واحد نتمكن من تحميل عملائنا المجالات ، بالإضافة إلى بنية نظام الملفات هو الكثير أكثر إتقانا.

بعد دمج الملفات, اضطررت إلى تحرير مشروع visual studio قائمة إزالة 12 منفصلة assmeblies وإضافة ملف واحد كمرجع ، وإلا فإنه يشكو أنه لم استطع العثور على محدد الجمعية.ايم ليس متأكدا كيف هذا من شأنه العمل على النشر الرغم من ذلك ، قد يكون من المفيد أن يعطي هو محاولة.

أعرف أن هذا هو السؤال القديم, ولكن نحن فقط استخدام ILMerge للحد من عدد من تبعيات ولكن أيضا أن يستوعب "الداخلية" تبعيات (على سبيل المثال automapper ، restsharp ، إلخ) التي يتم استخدامها من قبل الأداة المساعدة.وهذا يعني تماما أنها المستخرجة بعيدا المشروع باستخدام دمج الأداة لا تحتاج إلى معرفته حول لهم.هذا مرة أخرى يقلل من المراجع المطلوبة في المشروع ، كما يتيح لها استخدام / تحديث الإصدار الخاص به من نفس مكتبة خارجي إذا لزم الأمر.

نحن نستخدم ILMerge على عدد غير قليل من المشاريع.على خدمة ويب مصنع البرمجيات, على سبيل المثال تنتج ما يقارب 8 جمعيات انتاجها.نحن دمج كل هذه DLLs في واحد DLL بحيث الخدمة المضيف لن يكون لها سوى مرجع واحد DLL.

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

كان لدينا نفس المشكلة مع الجمع بين WPF التبعيات ....ILMerge لا تظهر للتعامل مع هذه.Costura.Fody عملت تماما بالنسبة لنا ومع ذلك استغرق حوالي 5 دقائق للحصول على الذهاب...تجربة جيدة جدا.

فقط تثبيت مع Nuget (اختيار الافتراضي الصحيح المشروع في حزمة مدير وحدة التحكم).انه يقدم نفسه إلى الهدف المشروع الإعدادات الافتراضية عملت على الفور بالنسبة لنا.

أنه يدمج كافة DLLs التي تم وضع علامة "نسخ المحلية" = صحيح وتنتج دمجها .EXE (إلى جانب الإخراج القياسي) الذي هو لطيف مضغوط الحجم (أقل بكثير من إجمالي حجم الانتاج).

رخصة معهد ماساتشوستس للتكنولوجيا حيث يمكنك تعديل/توزيع النحو المطلوب.

https://github.com/Fody/Costura/

ملاحظة أن ويندوز واجهة المستخدم الرسومية البرامج (على سبيل المثال WinForms) سوف تحتاج إلى استخدام /الهدف:winexe التبديل.
على /الهدف:exe التبديل يخلق اندمجت وحدة التحكم التطبيق.

لقد واجهت مشاكل عند دمج DLLs التي تم الموارد في نفس مساحة الاسم.في دمج عملية واحدة من الموارد مساحات تم تغيير اسمها ومن ثم الموارد لا يكون موجودا.ربما نحن فقط نفعل شيئا خطأ هناك لا تزال تحقق في القضية.

بدأنا باستخدام ILMerge في الحلول التي يتم توزيعها واستخدامها في مشاريع أخرى و حتى الآن جيد جدا.يبدو أن كل شيء يعمل حسنا.حتى أننا غموض تعبئتها الجمعية مباشرة.

نحن ندرس تفعل الشيء نفسه مع MS مكتبة المؤسسة الجمعيات.

القضية الوحيدة الحقيقية أرى مع ذلك هو الإصدارات الفردية الجمعيات من الحزمة.

وقد أتيحت لي مؤخرا مشكلة حيث كان ilmerged الجمعية في الجمعية لدي بعض فصول هذه تم استدعائه عن طريق التفكير في Umbraco مفتوحة المصدر CMS.

المعلومات لإجراء المكالمة عبر انعكاس اتخذ من db الجدول أن الجمعية اسم مساحة الاسم من الفئة التي تنفذ واجهة.المشكلة أن انعكاس الاتصال سوف تفشل عندما dll كان il دمج ومع ذلك إذا كان dll كانت منفصلة وعملت كل شيء بخير.أعتقد أن المسألة قد تكون مشابهة لتلك longeasy هو ؟

أنا بدأت للتو باستخدام ILMerge كجزء من مخبري بناء الجمع بين الكثير من الحبيبات ناعما WCF العقود في مكتبة واحدة.أنه يعمل بشكل جيد جدا, ومع ذلك المدمجة الجديدة lib لا يمكن بسهولة التعايش مع مكونات المكتبات أو غيرها من يبس التي تعتمد على تلك مكون المكتبات.

إذا في مشروع جديد ، مرجع كل ILMerged lib و أيضا مكتبة تراث هذا يعتمد على واحدة من المدخلات أعطيته ILMerge, سوف تجد أن كنت لا يمكن تمرير أي نوع من ILMerged lib إلى أي الأسلوب في تراث المكتبة دون أن تفعل نوعا من نوع الخرائط (مثلا ، automapper أو رسم الخرائط اليدوية).لأن هذا هو مرة واحدة في كل شيء بتجميع أنواع بفعالية المؤهلين مع الجمعية اسم.

أسماء أيضا تصطدم ولكن يمكنك إصلاح ذلك باستخدام extern مستعار.

نصيحتي أن يكون تجنب بما في ذلك في دمج الجمعية أي متاحة للجمهور lib التي اندمجت الجمعية يفضح (مثلا ، طريق العودة نوع الأسلوب/منشئ معلمة مجال الملكية العامة...) إلا إذا كنت متأكدا من أن المستخدم من دمج الجمعية لا و لن تعتمد على free-standing نسخة من نفس المكتبة.

يبدو لي #1 ILMerge أفضل الممارسات لا تستخدم ILMerge.بدلا من, استخدام SmartAssembly.أحد أسباب هذا هو أن #2 ILMerge أفضل الممارسات تشغيل دائما PEVerify بعد القيام ILMerge لأن ILMerge لا يضمن أنها سوف بشكل صحيح دمج المجالس في صالح للتنفيذ.

أخرى ILMerge العيوب:

  • عند دمج ، شرائح XML التعليقات (إذا اهتممت هذا, وأود أن استخدام أداة التشويش)
  • فإنه لا بشكل صحيح التعامل مع خلق المقابلة .ملف pdb

أداة أخرى تستحق الاهتمام هي أحادية.سيسيل و أحادية.رابط [2] أداة.

[2]:http:// www.mono-project.com/Linker

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