0

プラグインをオンデマンドでロードする (AppDomain と MarshalByRefObject を使用する) アプリケーションがあり、プラグインを検証する別の方法を見つけようとしています。

現在、次のような実行可能なプラグインを特定しています。

_pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
foreach (var type in _pluginAassembly.GetTypes().Where(type => type.GetInterface("IPluginChat") != null || type.GetInterface("IPlugin") != null))
{
    _instance = Activator.CreateInstance(type, null, null);
    return ((IPlugin)_instance).Check();
}

ただし、プラグインの 1 つが難読化されている場合、GetTypes は即座に失敗します。

Could not load type 'Invalid_Token.0x01003FFF' from assembly 'SimplePlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

したがって、この方法では、難読化されたプラグインと難読化されていないプラグインの両方を実行することはできません。

これが機能するためには、プラグインがインターフェースのインポートされたメソッドとメインクラスを難読化しないようにする必要があることを理解しています。

つまり、難読化された型の読み取りに失敗する GetTypes を使用せずに、前述の 2 つのインターフェイス (IPlugin または IPluginChat) のいずれかを継承するメイン クラスを見つける方法はありますか?

4

1 に答える 1

1

確かに、「is」キーワードを使用できます。指定されたインスタンスが特定のタイプの場合、true が返されます。

非常に簡単な例を次に示します。

    interface a
    {

        int doIt();

    }

    interface b
    {

        int doItAgain();

    }

    class c : a, b
    {

        public int doIt() { return 1;  }
        public int doItAgain() { return 2;  }

    }

    var instance = new c();

    var isA = instance is a; //true
    var isB = instance is b; //true
    var isAForm = instance is Form; //false
于 2016-01-05T13:46:49.850 に答える