visual studio - असेंबली मर्ज करने के लिए विजुअल स्टूडियो बिल्ड प्रक्रिया में ILMerge को एकीकृत करने के लिए कैसे?




visual-studio visual-studio-2008 (6)

इस आलेख के साथ मैंने पाया एक मुद्दा: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx

यदि आपके पास कोई संदर्भ है कि आप ILMerge नहीं करना चाहते हैं तो आलेख में कोड विफल रहता है क्योंकि यह डिफ़ॉल्ट कॉपीलोकल व्यवहार को कुछ भी करने के लिए ओवरराइड करता है।

इसे ठीक करने के लिए - इसके बजाए:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

इस प्रविष्टि को इसके बजाय लक्ष्य फ़ाइल में जोड़ें (केवल .NET 3.5) (गैर-इल्मेज कॉपीलोकल फ़ाइलों को फ़िल्टर करने के लिए, और उन्हें सामान्य के रूप में देखें)

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>

मैं एक .NET DLL असेंबली और एक CB.NET कंसोल अनुप्रयोग प्रोजेक्ट द्वारा संदर्भित एक सी # क्लास लाइब्रेरी प्रोजेक्ट को एक कमांड-लाइन कंसोल निष्पादन योग्य में विलय करना चाहता हूं।

मैं इसे कमांड लाइन से आईएलएमर्ज के साथ कर सकता हूं, लेकिन मैं विजुअल स्टूडियो प्रोजेक्ट में संदर्भ असेंबली और परियोजनाओं के इस विलय को एकीकृत करना चाहता हूं। मेरे पढ़ने से, मैं समझता हूं कि मैं इसे एमएसबिल्ड टास्क या लक्ष्य के माध्यम से कर सकता हूं और इसे सी # / वीबी.नेट परियोजना फ़ाइल में जोड़ सकता हूं, लेकिन एमएसबिल्ड बड़ा विषय होने के बाद से मुझे कोई विशिष्ट उदाहरण नहीं मिल रहा है। इसके अलावा, मुझे कुछ संदर्भ मिलते हैं जो पोस्ट-बिल्ड इवेंट में ILMerge कमांड जोड़ते हैं।

  1. मैं एक दृश्य स्टूडियो (सी # / वीबी.नेट) प्रोजेक्ट में आईएलएमर्ज को कैसे एकीकृत करूं, जो कि सभी संदर्भित असेंबली (कॉपी-लोकल = सत्य) को एक असेंबली में मर्ज करने के लिए सिर्फ एमएसबिल्ड परियोजनाएं हैं?

  2. यह संभावित ILMerge में कैसे जुड़ता है। लक्ष्य फ़ाइल?

  3. क्या पोस्ट-बिल्ड इवेंट का उपयोग करना बेहतर है?


कुछ और जानकारी जो स्कॉट हंसेलमैन के समाधान को लागू करने वाले कुछ लोगों के लिए उपयोगी हो सकती हैं

जब मैंने इसे पहली बार सेट किया था तो यह शिकायत करेगा कि System.Core, आदि के संदर्भों को हल करने में सक्षम नहीं है। यह .NET 4 समर्थन के साथ कुछ करना है। .NET 4 फ्रेमवर्क निर्देशिका को इंगित करने वाले / lib तर्क सहित इसे ठीक करता है (वास्तव में केवल $ (MSBuildBinPath) शामिल करें)।

/lib:$(MSBuildBinPath)

तब मैंने पाया कि विलय करते समय IlMerge लटका होगा। यह थोड़ा सीपीयू और बहुत सी रैम का उपयोग कर रहा था लेकिन कुछ भी आउटपुट नहीं कर रहा था। मुझे निश्चित रूप से स्टैक ओवरफ्लो पर फिक्स मिला।

/targetplatform:v4

मैंने यह भी पाया कि स्कॉट के ब्लॉग आलेख में उपयोग की जाने वाली कुछ एमएसबिल्ड प्रॉपर्टीज ने प्रोजेक्ट की निर्देशिका से एमएसबिल्ड को निष्पादित करने पर भरोसा किया, इसलिए मैंने उन्हें थोड़ा सा tweaked।

फिर मैंने अपने स्रोत पेड़ के टूल फ़ोल्डर में लक्ष्य और ilmerge.exe को स्थानांतरित कर दिया, जिसके लिए पथों में एक और छोटा ट्विक की आवश्यकता थी ...

स्कॉट के मूल आलेख में एक को बदलने के लिए अंत में मैं निम्न निष्पादन तत्व के साथ समाप्त हुआ:

<Exec Command="&quot;$(MSBuildThisFileDirectory)Ilmerge.exe&quot; /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) &quot;$(MSBuildProjectDirectory)\@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" /> 

अद्यतन मुझे कॉपीिकोकल व्यवहार को रखने के बारे में तर्क लैब्स का जवाब भी मिला और यदि आप Nuget संकुल का उपयोग कर रहे हैं तो प्रतिलिपि से आवश्यक illerged असेंबली को छोड़कर। अन्यथा आपको संदर्भित असेंबली की प्रत्येक पैकेज निर्देशिका के लिए एक / lib तर्क निर्दिष्ट करने की आवश्यकता है जिसे विलय नहीं किया जा रहा है।


मेरे 2 सेंट - मैंने जेसन की प्रतिक्रिया को उठाया और इसे मेरे समाधान के लिए काम किया जहां मैं उसी फ़ोल्डर के अंदर * * डीएलएस के साथ * .exe को बिन / डीबग फ़ोल्डर में जेनरेट करना चाहता था।

<Exec Command="&quot;$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe&quot; /wildcards /out:&quot;$(SolutionDir)..\$(TargetFileName)&quot; &quot;$(TargetPath)&quot; $(OutDir)*.dll" /> 

नोट: यह समाधान स्पष्ट रूप से ILMerge nuget पैकेज संस्करण में हार्डकोड किया गया है। यदि आपके पास सुधार करने के लिए कुछ सुझाव हैं तो कृपया मुझे बताएं।


यह एक अच्छा article जो आपको दिखाएगा कि आउटपुट असेंबली में आपकी संदर्भित असेंबली को कैसे विलय करना है। यह दिखाता है कि msbuild का उपयोग करके असेंबली कैसे विलय करें।


" एमएसबिल्ड आईएलएमर्ज कार्य " (या MSBuild.ILMerge.Task ) NuGet पैकेज इस प्रक्रिया को काफी सरल बनाता है। यह आपकी मुख्य असेंबली में किसी भी "प्रतिलिपि स्थानीय" संदर्भों को विलय करने के लिए डिफ़ॉल्ट है।

नोट: हालांकि पैकेजों के समान नाम हैं, लेकिन यह ILMerge.MSBuild.Tasks से अलग है जो डेविड ILMerge.MSBuild.Tasks ने उनके answer में उल्लेख किया है। जिस पर मैं सुझाव दे रहा हूं वह पहली बार अगस्त 2014 में प्रकाशित हुआ था।







ilmerge