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




visual-studio visual-studio-2008 (7)

जोमो द्वारा इस आलेख को देखें। आईएसएमर्ज को एमएसबिल्ड सिस्टम में हैक करने के लिए उसकी एक त्वरित प्रक्रिया है

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

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

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

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

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


यहां एक वैकल्पिक समाधान:

1) nuget से ILMerge.MSBuild.Tasks पैकेज स्थापित करें

पीएम> इंस्टाल-पैकेज ILMerge.MSBuild.Tasks

2) प्रोजेक्ट की * .csproj फ़ाइल संपादित करें जिसे आप नीचे दिए गए कोड को जोड़कर विलय करना चाहते हैं:

  <!-- Code to merge the assemblies into one:setup.exe -->
  <UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
  <Target Name="AfterBuild">
    <ItemGroup>
      <MergeAsm Include="$(OutputPath)$(TargetFileName)" />
      <MergeAsm Include="$(OutputPath)LIB1_To_MERGE.dll" />
      <MergeAsm Include="$(OutputPath)LIB2_To_MERGE.dll" />
    </ItemGroup>
    <PropertyGroup>
      <MergedAssembly>$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe</MergedAssembly>
    </PropertyGroup>
    <Message Text="ILMerge @(MergeAsm) -&gt; $(MergedAssembly)" Importance="high" />
    <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
  </Target>

3) सामान्य रूप से अपनी परियोजना का निर्माण करें।


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

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



मेरे 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 पैकेज संस्करण में हार्डकोड किया गया है। यदि आपके पास सुधार करने के लिए कुछ सुझाव हैं तो कृपया मुझे बताएं।


इस आलेख के साथ मैंने पाया एक मुद्दा: 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>

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







ilmerge