0

現在のプロジェクトでいくつかの問題に遭遇しました。誰かが洞察やアドバイスを提供してくれたら本当にありがたいです。

私のプロジェクトは、ユーザー スクリプトを実行するサービスです。スクリプトは 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

次の質問があります

  1. 私の最初のシナリオが機能するのはなぜですか。つまり、同じタイプのアセンブリを何度もビルドしてロードしていますが、すべて正常に動作しています

    2.ビルド後にS1を使用しない場合、モジュールを確認すると、すべてのアセンブリL1、S1、L2、S2がロードされていることがわかりますが、S2をビルドできます。どうやらアセンブリをロードすると、どういうわけかそれを使用しない場合、「アセンブリはロードされますが、タイプはロードされません」。本当に何が起こっているのですか?

    3.私の問題の解決策として何を提案しますか? 一時的な AppDomain を使用するのが最も論理的であるように見えますが、私はその経験がなく、非常に複雑に見えます。

ありがとうございました

4

1 に答える 1

0

ここでは、AppDomain が最善の策だと思います。マークが言ったように、自分が何をしているかを理解すれば、それらは実際にはそれほど悪くはありません。私が問題を見つけたという情報を見つけるだけです。

さて、恥知らずなプラグイン: リフレクション ロード アセンブリを支援するために、StackOverflow に関する別の質問のためにこのリポジトリを作成しました。AppDomain のセットアップと境界を越えた通信の基本をカバーする必要があります:プラグイン デモ

あなたの質問の外観から、シャドウ コピー部分を安全に無視し、ホスト プロジェクトのスキャナー/通信部分を使用することができます。

于 2013-02-08T11:17:40.523 に答える