Q1. C Sharpでexeに複数DLLをスタティックリンクさせて1ファイルにすることはできますか?
C、C++ではおなじみのスタティックリンクだが、そもそもC Sharpではスタティックリンクができない。ただし
MS Research謹製のILMergeを使えば実行ファイル(exe)に対して複数のクラスアセンブリ(DLL)を1つのアセンブリにマージすることはできる。使い方はこちらが参考になる。また、ILMerge-GUIというGUIツールもある。
Q2. Visual Studioのビルドでも自動的に複数ファイルを1つにまとめることはできますか?
パッケージマネージャーでILMerge.MSBuild.Tasksをインストールして*.csprojファイルに自動アセンブリ生成するための設定を追記するとVSのビルドで複数ファイルが1つのアセンブリにマージされたファイルが自動的にできあがる。参考: StackOverflow 「How to Integrate ILMerge into Visual Studio Build Process to Merge Assemblies?」
- ILMerge.MSBuild.Tasksをインストール
Install-Package ILMerge.MSBuild.Tasks
- *.csprojファイルに下記設定を追記
<!-- Code to merge the assemblies into one -->
<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)追加するDLLファイル名1" />
<MergeAsm Include="$(OutputPath)追加するDLLファイル名2" />
...
<MergeAsm Include="$(OutputPath)追加するDLLファイル名N" />
</ItemGroup>
<PropertyGroup>
<MergedAssembly>出力する結果アセンブリファイル名(フルパス)</MergedAssembly>
</PropertyGroup>
<Message Text="ILMerge @(MergeAsm) -> $(MergedAssembly)" Importance="high" />
<ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
</Target>
</Project>
- VSビルド実行で、マージされたファイルが生成(*.csprofのMergedAssemblyで指定したファイル名)
尚、前記事のコンソールアプリのサンプルコードでは‘*.csprojファイルにこの設定を追加しており、VSビルドで自動的に1アセンブリにマージされたexeファイルが生成されるようにしている。