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