新しいクラスを動的に生成/出力し、新しいクラスを含めるためにそれ自体にパッチを適用するアセンブリを作成することは可能ですか?
どのように?
新しいクラスを動的に生成/出力し、新しいクラスを含めるためにそれ自体にパッチを適用するアセンブリを作成することは可能ですか?
どのように?
ここで別の方法でこの質問をしました。AssemblyBuilderを使用して、保存されたアセンブリにリンクする代わりに、参照されるアセンブリのすべてまたは一部を埋め込むにはどうすればよいですか?
動的に生成されたコードで既存のdllにパッチを適用すると、動的に生成されたコードに元のdllを埋め込むのと同じ結果になります。つまり、両方のコンテンツを含む単一のアセンブリです。
何らかの方法で、依存関係を排除し、複数のアセンブリのコンテンツを1つにまとめるには、ILMergeユーティリティが最も洗練されたソリューションのようです。
唯一の問題は、マージされたdllで生成されたタイプが、元のdllの両方で同じタイプと互換性がないことです。たとえば、元のDLLが新しいアセンブリを発行し、それをそれ自体とマージして、新しいアセンブリをロードする場合、独自のタイプを使用して、いずれかの同じタイプに対応する新しいアセンブリ内のものを参照することはできません。元のアセンブリ。
言い換えると、[dll_generator]のクラスAは[dll_1]を参照します。クラスAは[dll_2]を生成します。これは、[dll_1]に基づいており、もちろん[dll_1]も参照します。クラスAはILMergeを呼び出して、[dll_2]をその依存関係[dll_1]と組み合わせて、[dll_merged]を生成します。[dll_merged]のタイプはいずれも、[dll_1]および[dll_2]の元のタイプと互換性がないため、クラスAが[dll_merged]をロードし、元の参照から[ dll_1]、タイプに互換性がないため、失敗します。クラスAが[dll_merged]の型を処理できる唯一の方法は、名前でそれらをロードし、「Type」オブジェクトとリフレクションを完全に処理するか、新しい[dll_merged]に対してソースコードを動的にコンパイルすることです。
これを行う最良の方法は、依存性の注入/制御の反転、または単純なサービスロケーターを使用することです。
新しいアセンブリは、新しい具体的な実装を作成し、古い実装の代わりにそれを登録します。
もっとエキゾチックなものは、確かにひどいハックになると確信しています。