Smart Assembly を試してみましたが、非常に満足しています。エラー報告機能は素晴らしいです。依存関係の統合も非常に優れた機能でした。私の質問は、Smart Assembly のように機能する無料の代替品はありますか?
私は Eazfuscator.NET を試してみました。これは優れた難読化ツールでしたが、Smart Assembly のお気に入りの 2 つが欠けています。.Net フレームワークのエラー レポートと依存関係の統合に使用できる無料のツールはありますか。
Smart Assembly を試してみましたが、非常に満足しています。エラー報告機能は素晴らしいです。依存関係の統合も非常に優れた機能でした。私の質問は、Smart Assembly のように機能する無料の代替品はありますか?
私は Eazfuscator.NET を試してみました。これは優れた難読化ツールでしたが、Smart Assembly のお気に入りの 2 つが欠けています。.Net フレームワークのエラー レポートと依存関係の統合に使用できる無料のツールはありますか。
Eazfuscator.NETのドキュメントを読んでいるときに、アセンブリのマージとアセンブリの埋め込みと呼ばれる 2 つの機能が含まれていることがわかりました。エラー報告のために、独自のライブラリを作成しました。このライブラリはCodePlex CrashReporter.NETにあります。
以下の手順に従って、誰でもアセンブリのマージまたは埋め込みを使用できます
アセンブリのマージ
序章
アセンブリのマージにより、複数のアセンブリを 1 つにマージできます。これは、展開とセキュリティの観点から有益な場合があります。
アセンブリのマージ テクノロジは、その下で ILMerge ユーティリティを使用します。したがって、アセンブリのマージを使用するには、マシンに ILMerge がインストールされていることを確認してください。アセンブリのマージは、ILMerge ユーティリティを個別に使用することでも実現できますが、ほとんどの場合、Eazfuscator.NET が提供するアセンブリのマージ インターフェイスを使用する方がはるかに便利です。
Eazfuscator.NET と ILMerge の直接使用からのアセンブリ マージを使用する利点
Eazfuscator.NET は、Eazfuscator.NET Assistant の助けを借りて、プロジェクトのビルド プロセスに自動的に統合されます。ILMerge を直接使用する場合は、プロジェクトのビルド イベント ハンドラーを手動で記述する必要があります。Eazfuscator.NET はプロジェクトの署名オプションを魔法のように処理します。ILMerge を直接使用する場合は、署名キーとオプションを手動で指定する必要があります。Eazfuscator.NET は、入力アセンブリから自動的に検出されるターゲット プラットフォーム情報を ILMerge に提供します。ILMerge を直接使用する場合は、この情報を手動で提供する必要があります。Eazfuscator.NET は ILMerge に必要なすべてのオプションを提供するため、ILMerge のマニュアルを読む必要はありません。統合を大幅に高速化します
デフォルトでは、アセンブリの難読化中にアセンブリのマージは使用されません。
指示
アセンブリのマージを有効にするには、特別に形成された属性をアセンブリに適用する必要があります。これを行うには、以下の手順を使用できます。
アセンブリのマージを有効にする手順
IDE 内で難読化可能なプロジェクトを開く 新しいソース ファイルをプロジェクトに追加し、それを ObfuscationSettings.cs (C# の場合) または ObfuscationSettings.vb (Visual Basic .NET の場合) と呼びます。ObfuscationSettings.cs または ObfuscationSettings.vb の代わりに別の名前を使用することをお勧めします。 ObfuscationSettings.cs に次の内容を入力します (C#)。
using System; using System.Reflection; [assembly: Obfuscation(Feature = "merge with XXXXXX.dll", Exclude = false)]
Visual Basic .NET の場合、ObfuscationSettings.vb に次の内容を入力します。
Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="merge with XXXXXX.dll", Exclude:=False)>
ノート
XXXXXX.dll を、マージするアセンブリのファイル名に変更します。
ヒント
複数のアセンブリとマージする場合は、いくつかの属性を追加するだけです:
using System; using System.Reflection; [assembly: Obfuscation(Feature = "merge with Assembly1.dll", Exclude = false)] [assembly: Obfuscation(Feature = "merge with AnotherAssembly2.dll", Exclude = false)] …
注: アセンブリのマージを使用すると、難読化が失敗する可能性がある副作用が発生する可能性があります。そのような場合は、最小公倍数の原則を使用して、難読化の失敗を引き起こさないアセンブリのみをマージします。アセンブリの埋め込みは、組み合わせて、またはアセンブリのマージの代替として使用できます。
ILMerge のカスタム パラメータ
カスタム パラメータを ILMerge ユーティリティに渡す必要がある場合があります。たとえば、クラスの内部化を自分で制御したり、トリッキーな ILMerge 機能を使用したりすることができます。これを行うには、以下の手順を使用できます。
カスタム パラメータを ILMerge に渡す手順
IDE 内で難読化可能なプロジェクトを開く 新しいソース ファイルをプロジェクトに追加し、それを ObfuscationSettings.cs (C# の場合) または ObfuscationSettings.vb (Visual Basic .NET の場合) と呼びます。ObfuscationSettings.cs または ObfuscationSettings.vb の代わりに別の名前を使用することをお勧めします。 ObfuscationSettings.cs に次の内容を入力します (C#)。
using System; using System.Reflection; [assembly: Obfuscation(Feature = "ilmerge custom parameters: <parameters>", Exclude = false)]
Visual Basic .NET の場合、ObfuscationSettings.vb に次の内容を入力します。
Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="ilmerge custom parameters: <parameters>", Exclude:=False)>
ノート
渡したいパラメータで変更します。Eazfuscator.NET は、属性が定義されていない場合、既定で /internalize /ndebug パラメーターを渡します。パラメータを ILMerge に渡したくない場合は、文字列なしで変更します。
アセンブリの組み込み手順
アセンブリの埋め込み
序章
アセンブリの埋め込みにより、アセンブリの依存関係をアセンブリ自体に埋め込むことができます。これは、展開とセキュリティの観点から有益な場合があります。
アセンブリの埋め込みはマージに似ています。主な違いは、アセンブリが埋め込まれたときに単一のアセンブリにマージされないことです。それらは、アセンブリ リソースとして暗号化およびパックされるだけです。その結果、出力には単一のアセンブリがあり、同じファイルにパックされた依存関係が含まれています。
マージがある場合 (またはその逆) に埋め込むことのポイントは何ですか? アセンブリのマージにより、結果のアセンブリに最高のパフォーマンスが提供されます。それらは NGENed にすることができ、すべての制約された環境 (Windows Phone、Compact Framework など) で動作します。ファイル マッピングと JIT 化されたコードは、このようなアセンブリのオペレーティング システムによってキャッシュされる可能性があり、アプリケーションの起動が非常に高速になります。アセンブリのマージは確実にうまくいきます。
マージの唯一の欠点は、アプリケーションを壊さずに適用できるとは限らないことです。したがって、これがアセンブリの埋め込みが助けになるポイントです。
組み込みアセンブリは簡単に達成できる目標であり、すぐに使用できます。欠点?まあ、彼らは存在しています。埋め込まれたアセンブリは NGEN できず、一部の制約のある環境 (Xbox、Windows Phone、コンパクト フレームフォーク) では機能しません。アプリケーションの読み込み中に埋め込まれたアセンブリを抽出すると、パフォーマンスが低下します (ペナルティは非常に小さいため、気付くことはほとんどありません)。
アセンブリの埋め込みには、いくつかの利点もあります。埋め込まれたアセンブリは暗号化されているため、これはハッカーに対するセキュリティ強化です。埋め込まれたアセンブリは圧縮され、結果のアセンブリのサイズが縮小されます。もちろん、アセンブリの埋め込みは、アプリケーションを単一の .exe (または .dll) ファイルで構成することで、単一ファイルの配置を実現する最も簡単な方法です。
指示
アセンブリの埋め込みを有効にするには、特別に形成された属性をアセンブリに適用する必要があります。これを行うには、以下の手順を使用できます。アセンブリの埋め込みを有効にする手順
IDE 内で難読化可能なプロジェクトを開く 新しいソース ファイルをプロジェクトに追加し、それを ObfuscationSettings.cs (C# の場合) または ObfuscationSettings.vb (Visual Basic .NET の場合) と呼びます。ObfuscationSettings.cs または ObfuscationSettings.vb の代わりに別の名前を使用することをお勧めします。 ObfuscationSettings.cs に次の内容を入力します (C#)。
using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
Visual Basic .NET の場合、ObfuscationSettings.vb に次の内容を入力します。
Imports System Imports System.Reflection <Assembly: Obfuscation(Feature:="embed XXXXXX.dll", Exclude:=False)>
ノート
XXXXXX.dll を、埋め込むアセンブリのファイル名に変更します。
重要
埋め込まれたアセンブリを難読化することをお勧めします。
ヒントEazfuscator.NET は、ファイル名のみが指定されている場合、アセンブリ パスを自動的に見つけます。アセンブリへの正確なファイル パスを指定する場合は、スクリプト変数を使用できます。
[assembly: Obfuscation(Feature = @"embed $(InputDir)\Lib\AssemblyToEmbed.dll", Exclude = false)]
ヒント
複数のアセンブリを埋め込みたい場合は、いくつかの属性を追加するだけです:
[assembly: Obfuscation(Feature = "embed Assembly1.dll", Exclude = false)] [assembly: Obfuscation(Feature = "embed AnotherAssembly2.dll", Exclude = false)] …
チューニング
埋め込まれたアセンブリは、既定で圧縮および暗号化されます。圧縮、暗号化、またはその両方をオフにすることをお勧めします。そのためには、以下の注意事項をお読みください。
アセンブリ埋め込み用のカスタム属性の完全な表記は、次の形式になります。
[assembly: Obfuscation(Feature = "embed [flags] XXXXXX.dll", Exclude = false)]
[flags] は、スペースで区切られたオプションのフラグの列挙です。
使用可能なフラグのリストを以下の表に示します。
以下は、アセンブリ埋め込み属性のフラグのリストです。
フラグ 説明 no_compress 圧縮を無効にします no_encrypt 暗号化を無効にします no_satellites サテライト アセンブリの自動埋め込みを無効にします load_from_file 難読化されたアセンブリの実行時にメモリではなくファイルから埋め込みアセンブリをロードするよう Eazfuscator.NET に指示します。これは、System.Reflection.Assembly 型の Location プロパティの意味のある値を保持するために使用できます。
例を見てみましょう。
例 4.24。圧縮と暗号化なしでアセンブリを埋め込む
using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed [no_compress no_encrypt] XXXXXX.dll", Exclude = false)]
例 4.25。暗号化なしでアセンブリを埋め込みます。圧縮が有効になっています
using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed [no_encrypt] XXXXXX.dll", Exclude = false)]
例 4.26。アセンブリを埋め込みます。圧縮と暗号化が有効になっています
using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
例 4.27。独自のサテライト アセンブリを埋め込みます。圧縮と暗号化が有効になっています
using System; using System.Reflection; [assembly: Obfuscation(Feature = "embed satellites", Exclude = false)]
トラブルシューティングアセンブリの埋め込みは、アセンブリをリンクする最も非侵入的な方法ですが、まれに問題が発生する場合があります。この章では、考えられる問題と、それらを回避するための対応する解決策について説明します。System.Reflection.Assembly クラスの Location プロパティ 問題の概要。System.Reflection.Assembly クラスの Location プロパティは、アセンブリに近いファイルのパスを見つけるためによく使用されます。正しい解決策ではありませんが、これはほとんどの展開シナリオで機能します。
何が問題になる可能性がありますか? まず第一に、アセンブリのシャドウ コピーが使用されている場合、Location プロパティは完全に予期しない値を持つ可能性があり、意図したアプリケーション ロジックが壊れます。次に、対応するアセンブリが埋め込まれている場合、Location プロパティには null 値があります。
解決。代わりに EscapedCodeBase プロパティを使用してください。このプロパティは、すべての展開シナリオで常に正しい値を持ちます。以下のサンプルをご覧ください。
using System; class Program { static string GetEulaPath() { var assembly = typeof(Program).Assembly; // string location = assembly.Location; // Please do not use this. This is a flawed approach string location = new Uri(assembly.EscapedCodeBase).LocalPath; // <-- Use this instead return Path.Combine(Path.GetDirectoryName(location), "EULA.rtf"); } }
エラー報告については、NBug を試すことができます。依存関係の統合には、ILMerge を使用できます。
http://www.nbusy.com/projects/nbug
http://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx
ところで、SmartAssembly が本当に好きなら、購入を検討してください。