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でアセンブリをコンパイルする場合:いいえ、それはおそらく正常にロードされます



All Articles