4

新しいクラスを動的に生成/発行し、新しいクラスを組み込むように自身を修正するアセンブリを記述することはできますか?動的に新しいクラスを生成し、新しいクラスでそれ自身を修正するアセンブリを書くことは可能ですか?

どのようにですか?

+0

達成したいことは何ですか?あなたがしたいことのために別の方法があるかもしれないと思います。 – Kirtan

+0

質問をクリアしようとしています。 C#では、System.CodeDomとSystem.CodeDom.Compilerを使用して、実行時にコードを生成およびコンパイルし、結果の新しいアセンブリをロードし、リフレクションで呼び出すことができます。あなたの質問は、これはあなたが望むものではないように聞こえる。既存のアセンブリにパッチを適用する必要があります。私はそれを正しく理解していますか? – Accipitridae

+0

私はカスタム属性でタグ付けされたデータクラスを持つSQLServerに展開するアセンブリを持っています。各タグ付きクラスに対して、SQLServerでCLRスカラー値関数として登録される静的メソッドを作成します。これはチェック制約で使用されます。各関数は1つのクラスをインスタンス化しようとし、成功するとtrueを返します。これにより、アプリケーション内のデータ型がデータベースと一元化されます。その関数のリストを維持しないために、私はクラスと関数を動的に生成しています。このクラスは同じアセンブリ内でハンドコーディングされていましたが、現在はそのダイナミックです。私は単一のdllが欲しい。 – Triynko

答えて

2

私は別の方法でここにこの質問をした:Using AssemblyBuilder, how can I make all or any of the referenced assemblies embedded instead of linked in the saved assembly?

を動的に生成されたコードは、既存のDLLが動的に生成されたコードで、元のDLLを埋め込むことと同じことにつながるパッチの適用 - 内容の単一のアセンブリを両方の。

ILMergeユーティリティは、依存関係を排除し、複数のアセンブリの内容を1つにまとめるために、最も洗練されたソリューションです。

唯一の問題は、マージされたdllで生成された型が元のdllの両方で同じ型と互換性がないことです。たとえば、元のDLLが新しいアセンブリを発行し、それをそれ自身とマージし、新しいアセンブリをロードすると...新しいアセンブリのいずれかの同じタイプに対応するものを独自のタイプで参照することはできません元のアセンブリ。

つまり、 [dll_generator]のクラスAは[dll_1]を参照しています。クラスAは[dll_2]を生成します。これはもちろん、[dll_1]を参照しています。クラスAは[dll_2]とその依存関係[dll_1]を結合して[dll_merged]を生成するILMergeを呼び出します。 [dll_merged]の型は、[dll_1]と[dll_2]の元の型と互換性がないため、クラスAが[dll_merged]を読み込んで、元の参照からのリテラル型の名前を含む何かをしようとすると[ dll_1]、型が互換性がないため失敗します。クラスAが[dll_merged]の型で動作する唯一の方法は、名前でロードして 'Type'オブジェクトとリフレクションで完全に作業することです。新しい[dll_merged]に対してソースコードを動的にコンパイルします。

1

これを行う最善の方法は、依存関係の注入/制御の反転または単純なサービスロケータを使用することです。

新しいアセンブリは新しい実装を作成し、古い実装の代わりにそれを登録します。

私は確かに、もっとエキゾチックなものは恐ろしいハックになるでしょう。

+0

これ以上説明できますか?基本的には、私はデプロイするアセンブリを持っていて、以前はハンドコーディングされていたクラスが動的に生成されています。私は元のアセンブリでこのクラスを欲しがっていますが、私が手作業でコード化したのではなく、アセンブリによって動的に生成したかったのです。それは可能ですか? – Triynko

+0

autofacやwindsorのようなものを使用して、コンテナから注入される、またはコンテナから回収されるクラスの具体的な実装を登録することができます。実装を整理する簡単な方法です(それはひどく簡単な説明です)。 元の実装がコンテナまたはサービスロケータから引き出されるようにソフトウェアを再構築した場合、カスタム実装で簡単にオーバーライドできます(オリジナルが封印されていない限り)。 –

+0

私は思っていませんそれが私が探しているものです。データクラスは既に存在しており、DLLを拡張して各データクラスをインスタンス化する自動生成関数を持つだけで、SQL ServerにCLR関数として登録できます。これには、動的に生成されたコードを元のdllに含める必要があります。これまでのところ、私が使用している解決策は、ILMergeをポスト・エミット・ステップとして使用することです。 – Triynko

関連する問題