現在のプロジェクトでいくつかの問題に遭遇しました。誰かが洞察やアドバイスを提供してくれたら本当にありがたいです。
私のプロジェクトは、ユーザー スクリプトを実行するサービスです。スクリプトは C# で記述されており、実行時に CodeDomProvider を使用してアセンブリをビルドしています。アセンブリには単一のクラスが含まれています。
public Script : ScriptBase
{
public override void Run(){}
}
ユーザーはスクリプトを変更でき、変更が検出された場合。ScriptBase 子の新しいインスタンスを作成するコンテンツを再構築します。スクリプト S1 を含む元のアセンブリ A1 が現在の AppDomain に読み込まれたままであることはわかっていますが、それは私が支払う代償です。このシナリオは問題なく動作します。
ユーザー定義ライブラリ (実行時に編集可能) の機能を追加したかったのです。問題は、ライブラリ L1 を使用しているスクリプト S1 があることです。ユーザーが L1 を変更した場合、明らかにすべてのスクリプトを再構築する必要があります。そして、ここに問題があります:
build L1 with type T1
build S1 --depends--> L1
(use S1)
build L2 with type T1
build S2 --depends--> L2 = crashes type T1 is defined in L1 and L2
(use S1) //It passes through if I didn't use S1 for the first time
次の質問があります
私の最初のシナリオが機能するのはなぜですか。つまり、同じタイプのアセンブリを何度もビルドしてロードしていますが、すべて正常に動作しています
2.ビルド後にS1を使用しない場合、モジュールを確認すると、すべてのアセンブリL1、S1、L2、S2がロードされていることがわかりますが、S2をビルドできます。どうやらアセンブリをロードすると、どういうわけかそれを使用しない場合、「アセンブリはロードされますが、タイプはロードされません」。本当に何が起こっているのですか?
3.私の問題の解決策として何を提案しますか? 一時的な AppDomain を使用するのが最も論理的であるように見えますが、私はその経験がなく、非常に複雑に見えます。
ありがとうございました