複数のアセンブリを1つにマージする方法は?


87

次のサービススタックのDLLといくつかのAzureのDLLをEXEプロジェクトにコピーしたという点で、EXEプロジェクト(紺碧のアプリケーションの起動タスク)を使用してサービススタックを消費しています。

dll

このEXEプロジェクトをビルドすると、Azure DLLはEXEにバンドルされますが、サービススタックのDLLはEXEにバンドルされません。これは、任意のマシンでEXEを実行するには、すべてのサービススタックのDLLを手動でコピーする必要があるためです。

このサービススタックのdllを使用して使用しました

JsonServiceClient client = new JsonServiceClient(servicepath);

これらすべてのDLLをEXEにバンドルするにはどうすればよいですか?

回答:


120

いくつかのオプションがあります。

または

  • SmartAssembly(商用)のようなツールを使用
    して、他のものとの間で埋め込みおよびマージすることができます(ソースコードを変更する必要はありません)

または

  • 10行未満(無料ですがソースコードの変更は最小限)で
    、必要なすべての依存関係を「埋め込みリソース」としてマークするコード-このようにして、それらはEXEファイルに含まれます...AssemblyResolve実行時にリソースから読み取るハンドラーを設定する必要があります必要なDLLを.NETランタイムに返します。

4
アセンブリを埋め込むというJeffreyRichterのソリューションを思い出させてくれてありがとう!これを必要なコードの挿入と組み合わせるツールについては、Costuraについて言及している私の回答を参照してください。
CodeFox 2015

29

あなたが探しているツールはILMergeと呼ばれています。これはコマンドラインツールであり、次のように使用できます。

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

VSプロジェクトのセットアップにILMergeを含める方法を説明する記事もここにあります


こんにちは、外部リソース(ファイル/画像)を実行可能ファイルに追加できますか?
Emdadul Sawon 2017年

@EmdadulSawon多分あなたはあなたのライブラリの1つにリソースとしてそれらを含めることができますか?
アレクサンダー

27

埋め込みリソースとして参照アセンブリを含めるための優れたツールであるCosturaFodyアドイン)。著者のSimonKroppは、次のように説明しています。

[...] 2つの方法の組み合わせ:

その結果、NuGetからCostura.Fodyをフェッチするだけの非常にシンプルなソリューションがられます。

特徴:

  • デバッグシンボルを含む
  • 組み込みアセンブリの圧縮
  • 特定のアセンブリを含める/除外する
  • その他(Readmeを参照)

9
OMGCostura.Fodyが正解です。nugetからパッケージをインストールし、プロジェクトを再構築すると、スタンドアロンのEXEAWESOMEができました。
Eric Labashosky 2015年

4
こんなに簡単なのか信じられません。nugetからパッケージをインストールするだけで完了です。
iraSenthil 2016年

2
Costura.Fodyも使用しています。セットアップは簡単で、NuGetパッケージをリソースとして含めるのは非常に簡単です。プロジェクトを取得します。
マイケルシルバー

1
@ user3700562の場合、この手法では新しいアセンブリは作成されませんが、1つ以上の参照アセンブリが既存のアセンブリに埋め込まれます。
CodeFox 2018

1
素晴らしい解決策!一年から使っていて問題ありませんでした。ただし、最上位プロジェクトによって参照されるアセンブリのみが含まれることに注意してください。アプリがサードパーティのアセンブリを参照する別のプロジェクトを参照している場合は、それをトップレベルのプロジェクトに追加する必要があります。
デミール


3

WPFの依存関係がある場合は、オプションがさらに制限される可能性があります..... ILMergeはこれらを処理していないようです。Costura.Fody(上記のCodefoxで述べたように)は私たちにとって完璧に機能しましたが、開始するのに約5分かかりました...非常に良い経験でした。

Nugetを使用してインストールします(パッケージマネージャーコンソールで正しいデフォルトプロジェクトを選択します)。

「CopyLocal」= trueとマークされたすべてのDLLをマージし、マージされた.EXEを生成します(標準出力に加えて、ほとんどは不要になりました)。これも圧縮されます。その後、これをスタンドアロンで使用できます。

ライセンスはMITであるため、必要に応じて変更/配布できます。

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


2

チェックアウトServiceStack.Gapの単一のクロスプラットフォームへのショーHOWTO ILMerge ServiceStackの例をいくつかのプロジェクト.EXE

ServiceStackには、次のような組み込みアプリの作成に特に適した他の多くの機能も含まれています。

  • .NETのHTTPリスナーを使用してサービスをセルフホストできるようにします
  • プリコンパイルされたRazorビューをサポートします
  • 組み込みリソースをサポート
  • SqliteおよびOrmLiteの組み込みデータベースをサポートします
  • 単一の.exeにILMマージできます

1

.net core 3では、プロジェクト構成に、単一ファイルの公開とトリミングと呼ばれる2つの新しいオプションが導入されています。

ドキュメントの詳細については、こちらをご覧ください。プロジェクト構成は、参照用にここにコピーされています。

  1. プロジェクト構成:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. CLIの使用:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

2つのオプションを組み合わせて、アプリケーション用にトリミングされた単一のアセンブリを取得することは完全にサポートされています。


これは、単一のアセンブリではありません。ファイルをzipアーカイブに圧縮し、アプリケーションを実行しようとしたときにユーザーフォルダーに解凍するだけです。
ジェスパー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.