C#+ WPF +サードパーティアセンブリ-> one .exe-shnik

C#とWPFで小さなアプリケーションを開発する必要がありますが、サードパーティアセンブリ(SharpZipLib、Unityなど)を使用しているため、出力では、小さな.exe-shnikに加えて、.dll-okの束も取得する必要がありますが、 .exe-shnikは1つだけでした。

ここで知識のある人はほとんどMicrosoft ILMergeユーティリティを思い出せませんが、残念ながらXAMLファイルのコンパイルの特性のためにWPFアプリケーションに問題があります。
トリッキーなアセンブリにも問題があり、それはまともな難読化ツールを通過しました。

一部の製品で使用する別のソリューションを提案します。すべてのサードパーティアセンブリを埋め込みリソースとして組み込み、App.xaml.csでこれを行います。

public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  1. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  2. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  3. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  4. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  5. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  6. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  7. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  8. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  9. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  10. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  11. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  12. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  13. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  14. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  15. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  16. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  17. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  18. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  19. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  20. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  21. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  22. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  23. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  24. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  25. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  26. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
  27. public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .
public partial class App : Application { // private void OnStartup( object sender, StartupEventArgs e) { // AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; } // static Assembly ResolveAssembly( object sender, ResolveEventArgs args) { // ( ) Assembly thisAssembly = Assembly .GetExecutingAssembly(); // var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) + ".dll" ; // var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name)); using ( Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) { // byte [] block = new byte [stream.Length]; stream.Read(block, 0, block.Length); // return Assembly .Load(block); } } } * This source code was highlighted with Source Code Highlighter .


したがって、このようなアプローチでは、通常アセンブリファイルを呼び出します。

この方法ではアイデアを示すだけであり、起こりうるエラーのハンドラーも他にも多くないことを覚えておくことが重要です。

他に改善できること-出力.exe-shnikのサイズを縮小して、DeflateStreamを介してアセンブリを圧縮し、それに応じてそれらを読み取って展開することができます。 アセンブリが更新されたかどうかを定期的に確認でき、更新された場合は、ネットワークからロードします(特に小さい場合)。

そして、はい、おそらく動作しない可能性高い重要なポイント-このようなアセンブリでは、ネイティブメソッドを持つアセンブリは動作しない可能性が高い、つまり C ++ / CLIで書かれています。 私が間違っている場合は私を修正してください。

[更新]
C ++ / CLIに関して-MSDNによると-C ++コンパイラが.exeファイルから.relocセクションを削除した場合、BadImageFormatExceptionがスローされます。 /固定でC ++ / CLIでアセンブリをコンパイルする場合:いいえ、それはおそらく正常にロードされます

Source: https://habr.com/ru/post/J67836/


All Articles