私はC#で書かれた.NETアプリケーション用の単純なプラグインシステムを作成しています。私はこれを達成するためにIronPythonを使用しようとしています。.NETインターフェイスを実装するC#のIronPython型のインスタンス化
私の.NETコードでは、すべてのプラグインが実装する必要があるインタフェースIPluginを作成しました。 プログラムのユーザーは、Pythonファイルへのパスを指定します。このパスには、IPluginを実装するクラスが多数あり、そうでないクラスもあります。
CompiledCodeオブジェクトとそのScriptScopeを取得したら、コードに定義されているすべてのクラスを反復して、IPluginインターフェイスを実装するインスタンスをインスタンス化します。私はすべてのIronPythonTypeオブジェクトを盲目的にインスタンス化するだけでなく、結果のオブジェクトがIPluginタイプであるかどうかをチェックする以外に、これをどうやって行うのか分かりません。これは理想的ではありません。
ここに、私が現在持っているコードのスニペットがあります。
public void LoadPlugins(string filePath) {
try {
ScriptSource script = _ironPythonEngine.CreateScriptSourceFromFile(filePath);
CompiledCode code = script.Compile();
ScriptScope scope = _ironPythonEngine.CreateScope();
var result = code.Execute(scope);
foreach (var obj in scope.GetItems().Where(kvp => kvp.Value is PythonType)) {
var value = obj.Value;
var newObject = value();
if (newObject is IPlugin) {
// Success. Call IPlugin methods.
} else {
// Just created an instance of something that is not an IPlugin - this is not ideal.
}
}
} catch (Exception) {
// Handle exceptions
}
}
これは、乾杯! – Optical