2

ILMerge で動作する基本的な VS 2012 プロジェクトを取得しようとしているので、最終的にはより複雑な例に移行できます (最終的には実際のプロジェクトで使用できるようになります)。

現在、私は作業中のプロジェクト、TestMainおよび参照ライブラリを作業中TestDLLのプロジェクトに持っています。

私の作業ディレクトリ (..\bin\Release) は次のとおりです。

  • ILMerge.exe
  • TestDLL.dll
  • TestDLL.pdb
  • TestMain.exe
  • TestMain.exe.config
  • TestMain.pdb
  • TestMain.vshost.exe
  • TestMain.vshost.exe.config
  • TestMain.vshost.exe.manifest

私の端末出力は次のとおりです。

C:...\bin\Release>ilmerge /target:winexe /out:ContainedProgram.exe "TestMain.exe" "TestDLL.dll"

マージ中に例外が発生しました: ILMerge.Merge: 場所 'C:...\bin\Release\TestMain.exe' からアセンブリを読み込めませんでした。残りの引数をスキップして処理します。ILMerging.ILMerge.Merge()
で ILMerging.ILMerge.Main(String[] args) で

シンプルですね。ここで何が欠けていますか?

更新: .exe を削除し、ライブラリのみで ILMerge を実行すると機能します。.dll を削除して実行可能ファイルのみで実行しても、エラー出力は変わりません。

また、2 つ目の .dll を作成し、ILMerge を使用して 2 つの既存のライブラリを次のように 1 つにマージすることができました。

ilmerge /targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:Test.dll "TestDLL2.dll" "TestDLL.dll"

Update 2したがって、次のようにTestRun.exeを作成できました。

ilmerge /targetplatform:v4,c:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:TestRun.exe "TestMain.exe" "Test.dll"

これにより、2 つの参照ライブラリ .dll が一緒にパッケージ化され、実行可能ファイルと共にパッケージ化されました。そしてそれは働いた!期待通りの結果を得ることができました。

新しい実行可能ファイルをホームフォルダーから移動するまで。

新しい場所に移動するとすぐに、実行すると次のエラーが発生しました。

未処理の例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'TestDLL、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

TestMain.Program.Main (文字列 [] args) で

4

2 に答える 2

1

どのバージョンのフレームワークを使用していますか? たとえば、4.0/4.5 を使用している場合は、設定が必要な targetplatform オプションがあります。

/targetplatform:version,platformdirectory

于 2013-02-28T17:46:07.320 に答える
1

[これは私が比較的すぐに見つけた他の関連する質問だったので繰り返し回答しますが、それは私の問題を解決するのに役立ちませんでした]

私はこの古い質問に答えています。スタック オーバーフローに関する自分自身の関連する質問への回答が見つからず、他の人に役立つ可能性があるからです。私の場合、インストーラーの不具合を修正するために、VS2013 で古いソリューションに触れて再構築しようとしていました (IIS10 を IIS4 よりも新しいものとして認識していません)。

マージ操作で「指定されたファイルが見つかりません。エラー コード 0x80070002」というメッセージが表示されました。このエラーを無視してアプリケーションをインストールすると、実行時例外が発生します。もちろん、「指定されたファイル」はビルドフォルダーにありました。

この問題の根本的な原因は、4.0 以降のフレームワークが「インプレース アップグレード」であり、一部の依存関係がコア ライブラリを移動していることです (長い議論については、http ://www.hurryupandwait.io/blog/what- を参照してください)。 you-should-know-about-running-ilmerge-on-net-4-5-assemblies-targeting-net-4-0 )。要するに、いくつかのバージョンの ilmerge が利用可能である可能性がありますが、依存関係を正確にアンシャッフルできることが保証されているのは最新のものだけであり、実行時に何かが検出されるため、指定されたファイルではありません。欠落しています。これは、基になる呼び出しへのポインターです。

私の場合の解決策は、NuGet から取得した ilmerge のバージョンを見つけ、それを古いソリューションから参照し、他のすべてをそのままにしておくことでした。(私はこれを知っているべきでしたが、急いでいた/まっすぐに考えていなかったので、エラーメッセージ誤解を招きます...)。

于 2020-11-10T18:45:53.870 に答える