10

私の人生では、.NET 4 アプリケーションを ILMerge と適切にマージすることができないようです。/targetplatform、/lib、/ndebug を設定し、カスタム ILMerge.exe.config ファイル追加した後でも、出力ファイルは正しく機能しません (マージされたライブラリを「見つける」ことができないようです)。

私はこれこれを無駄に試しました。構成ファイルを使用しない限り、ビルドすることさえできませんが、実行しても機能しません。構成ファイルがないと、「未解決のアセンブリ参照は許可されていません: PresentationFramework 」というエラー メッセージが一貫して表示されます。

ビルド後のイベントとして使用されている ILMerge コマンドの現在の状態を次に示します。

ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe 
  /ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
  /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319" 
  /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll" 
  "C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll" 
  "C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll"

私が間違っていることについて何か考えはありますか??

4

5 に答える 5

8

コスチュラを試すことができます。

https://github.com/Fody/Costura#how-it-works

基本的にはジェフリー・リクターのアプローチが必要です

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

ただし、コードを記述する必要がない方法で行います。つまり、「AssemblyResolve」メソッドを記述する必要はありません

于 2011-08-10T22:58:34.667 に答える
8

WPF で .dll を結合するために使用された 1 つの提案は、単に dll をプロジェクトの埋め込みリソースとして追加し、プログラムで dll をアセンブリにロードすることです。

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {

   String resourceName = "AssemblyLoadingAndReflection." +

      new AssemblyName(args.Name).Name + ".dll";

   using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {

      Byte[] assemblyData = new Byte[stream.Length];

      stream.Read(assemblyData, 0, assemblyData.Length);

      return Assembly.Load(assemblyData);

   }

};

参照: http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

于 2011-02-02T22:23:07.803 に答える
7

ILMerge の作成者である Mike Barnett にメールを送信したところ、残念ながら WPF アプリで動作するようには設計されていないと説明され、WPF 3.5 アプリで動作することを伝えたときは驚きました。それは実際にはサポートされていないので、今のところこれを書き留めて、別の代替手段が現れるのを待ちます.

補足として、私はEzirizの.NET Reactor を試してみましたが、実際にはうまく機能しましたが、180 ドルの費用がかかり、趣味のプロジェクトとしてはまだあまり使いたくありません。しかし、それは Red Gate の他の市販の代替品よりもはるかに安いので、私はそれについて言及したいと思いました.

更新: Mike Barnett は、この質問に対する受け入れられた回答を最善の解決策と見なしています。彼によると、それが可能だと知っていたら、そもそも ILMerge を書くことはなかったでしょう。

于 2010-08-05T19:57:56.890 に答える
6

ILMerge が WPF リソース文字列を更新しないのは事実ですが、 (.NET 4.0 クライアント プロファイルの場合)などに、ランタイム ディレクトリの代わりに参照アセンブリ ディレクトリを渡すことで、アセンブリを WPF 参照とマージするために使用できます。/targetplatform/targetplatform:v4,"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client"

これを使用して、Rx の System.Reactive.dll をマージします。この System.Reactive.dll は への参照を持ってDispatcherいますが、実際の WPF リソースはありません。

于 2010-09-16T15:40:53.743 に答える
3

あなたのアセンブリが「dialogs.wpf」と呼ばれていることに気付きました。現在、ILMerge は、WPF リソースを含むアセンブリを正しくマージしません。

これに関する情報はあまりありませんが、このフォーラムの投稿には可能な解決策が記載されており、この質問への回答にはいくつかの可能性が言及されていますが、最も投票数の多い提案は、商用の代替品を購入することです-かどうかはわかりませんそれはあなたにとって可能性です。

機能しない理由を説明する議論がここにあり、xaml のリソース参照を変更すると問題の解決に役立つ可能性があるという提案がここにあります

于 2010-07-30T13:27:11.540 に答える