1

新しいライブラリを作成するとき、、 、 などMyAPI.dllの他の多くの (非標準) ライブラリを参照しています。これらの他のライブラリをすべてダウンロードし、プロジェクトのbin フォルダーに保存されていますが、そのライブラリを公開して新しい場所で使用しようとすると、参照されているライブラリが見つからないため失敗します。RestSharp.dllNewtonsoft.dllMyUtilities.dll

MyAPI.csprojこれらの dll/ライブラリがパブリッシュされた.dllファイルにパッケージ化され、将来のユーザーがMyAPI.dllこれらの依存関係をダウンロードして参照することを心配する必要がないように、プロジェクトをセットアップするにはどうすればよいですか?

これは簡単だと思っていましたが、今日の私のgoogle-fuは弱いです。これらの外部参照をディレクトリCopyLocal = Falseから削除するように設定する/bin/と、それらが MyAPU.dll にパッケージ化されているように見えますが、実際には Visual Studio はそれらをグローバル アセンブリ キャッシュ (GAC) に追加しているだけであり、今後のユーザーの役に立ちません。 API。

4

3 に答える 3

4

2つのオプションがあります(私の知る限り):

  1. ILMerge
  2. 埋め込みリソースと Assembly.Resolve ( Jeffrey Richterを参照)

最初に、複数の .NET アセンブリをマージして 1 つの出力ファイルを作成できるコマンドライン プログラムであるILMergeを使用できます。WPF プロジェクトをマージできません。ビルド後のイベントに追加して、マージを自動化できます。

2 つ目は、ライブラリを埋め込みリソースとしてプロジェクトに追加し、Assembly.Resolve イベントに登録して、リソースから必要なときにアセンブリをロードすることです。この方法に関する Jeffrey Richter の記事: Jeffrey Richter .

2 番目の方法には大きな欠点があります。複数のライブラリを 1 つにマージすることはできません (実行可能ファイルにライブラリを追加する場合にのみ使用できます)。少なくとも別のツールを使用しない C# では機能しません。ライブラリをライブラリに追加するには、別のツールを使用する必要があります。これは、2 ページ目の Jeffrey の記事のコメント (モジュール初期化子の注入) に記載されています。ライブラリを他のライブラリに埋め込む際の問題は、(少なくとも c# では) アセンブリに登録できないことです。 .組み込みライブラリが必要になる前にイベントを解決するため、モジュール初期化子注入を使用して登録をモジュール初期化子に注入する必要があります。ツールでページに書き込むビルドイベントとして設定することもできます。複雑に聞こえるかもしれませんが、設定さえすれば簡単です。

于 2013-06-04T21:02:15.640 に答える
3

無料の nuget パッケージ "Costura.Fody" があり、依存アセンブリをリソースとしてアセンブリにパックします。このソリューションは、WPF およびその他のマネージ アセンブリで動作します。

依存関係アセンブリが実行フォルダーにない場合は、パックされたアセンブリが自動的に取得されます。また、ビルド中に依存関係をパックするために、msbuild ターゲットを自動的に構成します。アセンブリにコードを追加する必要はありません。また、どのアセンブリを xml ファイルにパックするかどうかを構成することもできます。

次の 2 つの方法を組み合わせて使用​​します。

  • アセンブリをマージする方法として埋め込みリソースを使用するという Jeffrey Richter の提案。
  • cecil を使用してモジュール初期化子を作成する Einar Egilsson の提案。

ここでドキュメントを見つけることができます: https://github.com/Fody/Costura/blob/master/README.md

于 2013-07-04T10:38:54.237 に答える
0

無料ではありませんが (試用版があります)、私の友人が.NET Reactorと呼ばれるプログラムについて教えてくれました。このプログラムは、依存する DLL を含む exe を単一の実行可能ファイルにパッケージ化する機能を備えているので、一見の価値があります。

次の最も簡単な代替手段はClickOnceだと思います。良いチュートリアルはこちらです。

于 2013-06-04T20:57:06.040 に答える