私の.NETクラスのコンストラクタで、私のクラスに実際にメソッドを動的に追加するコードを記述したいとしましょう。だから今私がクラスを振り返ると、最初にプロジェクトを作成したときにメソッドが存在しなかったメソッドが表示されます実行時にDLLにコードを追加する方法
どのようにすればいいですか?
私はのCodeDOMを見てきたが、それは私
私の.NETクラスのコンストラクタで、私のクラスに実際にメソッドを動的に追加するコードを記述したいとしましょう。だから今私がクラスを振り返ると、最初にプロジェクトを作成したときにメソッドが存在しなかったメソッドが表示されます実行時にDLLにコードを追加する方法
どのようにすればいいですか?
私はのCodeDOMを見てきたが、それは私
すべて少し混乱だ....これをしたいと思う理由を想像することはできません。
理由を説明してもらえますか?
代わりに、ほとんどのコードを共有している場合は、同じインターフェイスの異なる具体的な実装、または抽象クラスを使用してみてください。
私はこれを達成しようとしています: http://stackoverflow.com/questions/885682/creating-udf-with-vsto-in-excel 最後の文章を読む –
Reflection.EmitまたはMono.CecilまたはPostSharpのいずれかを使用する必要があります。
これらのすべては簡単に学習できます。
アセンブリを読み込んだ後は変更できません。 Reflection.EmitまたはCodeDomを使用して、あなたの+余分なメソッドと同じクラスを使用して新しいアセンブリを動的にコンパイルできますが、既存の(実行時に少なくとも既存の)クラスは変更されません。潜在的には、別のAppDomainにクラスをロードし、そのエクストラを「コピー」した新しいクラスを作成し、そのアセンブリをメインのAppDomainにロードします(元のクラスをロードした場所をアンロードします)。既存のクラスに追加するのではなく、まだ新しいクラスを作成していますが、その効果は似ています。
ただし、クラスをロードする前にコード挿入を使用してコードを挿入できます。 .NETのためのいくつかのコードインジェクションフレームワークがありますが、これはあなたの特定の質問とは異なります。
CInject(Codeplexのオープンソース)を使用して余分なことを学ぶことなく、これを行うことができます。 C#またはVB.NETで注入するコードを記述してから、CInjectで処理して管理対象アセンブリに追加します。
私はappdomain domcomplie関数を使用して@ reed-copseyに同意します。プラグインの基本クラスを継承するプラグインクラスを作成し、必要なすべてのクラスを追加することができます。 appdomainでコンパイルすると、そのクラスに注入されたコーディングエラーを与えることさえできます。その後、その特定のクラスをコンパイルしません。少なくともコードには問題があることがわかります。
IDEの外でクラス/コードを開発しようとしていますか? – RSolberg