web-dev-qa-db-ja.com

ILMergeをVisual Studioビルドプロセスに統合してアセンブリをマージする方法

1つの.NET DLLアセンブリとVB.NETコンソールアプリケーションプロジェクトによって参照される1つのC#クラスライブラリプロジェクトを1つのコマンドラインコンソール実行可能ファイルにマージします。

コマンドラインからILMergeを使用してこれを実行できますが、この参照アセンブリとプロジェクトのマージをVisual Studioプロジェクトに統合したいと思います。私の読書から、私はMSBuildタスクまたはターゲットを介してこれを行うことができ、C#/ VB.NETプロジェクトファイルにそれを追加できることを理解していますが、MSBuildは大きなトピックであるため、特定の例は見つかりません。さらに、ILMergeコマンドをビルド後イベントに追加する参照をいくつか見つけました。

  1. ILMergeをMSBuildプロジェクトであるVisual Studio(C#/ VB.NET)プロジェクトに統合して、参照されるすべてのアセンブリ(copy-local = true)を1つのアセンブリにマージするにはどうすればよいですか?

  2. これはILMerge.Targetsファイルとどのように結びついていますか?

  3. ビルド後イベントを使用する方が良いですか?

72
AMissico

http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx の記事Visual Studioの単一アセンブリ内の言語をILMergeおよびMSBuildとシームレスに混合Visual Studioプロジェクト内でILMergeとMSBuildを使用する方法。

15
AMissico

" MSBuild ILMerge task "(またはMSBuild.ILMerge.Task)NuGetパッケージを使用すると、このプロセスが非常に簡単になります。デフォルトでは、「ローカルコピー」参照をメインアセンブリにマージします。

注:パッケージの名前は似ていますが、これは、Davide Icardiが answer で言及したILMerge.MSBuild.Tasksとは異なります=。ここで提案しているものは、2014年8月に初めて公開されました。

56

Scott Hanselmanのソリューション を実装している一部の人々に役立つかもしれないより多くの情報。

これを最初に設定したとき、System.Coreなどへの参照を解決できないことについて文句を言うでしょう。これは.NET 4サポートと関係があります。 .NET 4 Frameworkディレクトリを指す/ lib引数を含めると、それが修正されます(実際には、$(MSBuildBinPath)を含めるだけです)。

/lib:$(MSBuildBinPath)

マージ中にIlMergeがハングすることがわかりました。それは少しのCPUと多くのRAMを使用していましたが、何も出力していませんでした。私は修正を見つけました もちろんstackoverflowで

/targetplatform:v4

また、Scottのブログ記事で使用されているMSBuildプロパティの一部は、プロジェクトのディレクトリからMsBuildを実行することに依存しているため、少し調整しました。

次に、ターゲットとilmerge.exeをソースツリーのツールフォルダーに移動しました。これには、パスをさらに微調整する必要がありました...

最終的に次のExec要素になり、Scottの元の記事の要素を置き換えました。

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

[〜#〜] update [〜#〜]また、 Logic Labsの回答 CopyLocal動作を維持し、除外することについてNugetパッケージを使用している場合、CopyLocalからのilMergedアセンブリは不可欠です。それ以外の場合は、マージされていない参照アセンブリのパッケージディレクトリごとに/ lib引数を指定する必要があります。

18
Jason Duffett

ここで代替ソリューション:

1)nugetからILMerge.MSBuild.Tasksパッケージをインストールします

PM>インストールパッケージ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)通常どおりプロジェクトをビルドします。

18
Davide Icardi

http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx の記事で見つけた1つの問題。

ILMergeにしたくない参照がある場合、デフォルトのCopyLocal動作をオーバーライドして何もしないため、記事のコードは失敗します。

これを修正するには-代わりに:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

代わりに、このエントリをターゲットファイルに追加します(.NET 3.5のみ)(illmerge以外のcopylocalファイルを除外し、通常のように処理するため)

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

これは素晴らしい 記事 です。これは、参照アセンブリを出力アセンブリにマージする方法を示します。 msbuildを使用してアセンブリをマージする方法を正確に示しています。

4
Rohan West

2セント-@Jasonの応答を取得し、同じフォルダー内のすべての* .dllでbin/Debugフォルダーに* .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パッケージバージョンに明らかにハードコーディングされています。改善する提案があれば教えてください。

1
rui

Jomoによるこの記事をご覧ください。彼は、ILMergeをmsbuildシステムにハックする簡単なプロセスを持っています。

0
JaredPar