2

IronPythonをホストするC#で記述されたアプリケーションを開発しています。私が計画しているのは、ユーザーがPythonスクリプトを作成することです。このスクリプトには、事前定義されたインターフェイスを実装するクラスが含まれています。

何かのようなもの:

C#コードでインターフェイスを定義します。

public interface IPlugin
{
    void DoSomething();
}

Pythonコードでインターフェースを実装します。

class Plugin(IPlugin):

      def DoSomething():
          print "Doing stuff."

私のアプリケーションでは、Pythonスクリプトをロードし、それらのスクリプトのクラスによって実装されたメソッドを実行します。

知りたいのですが、Pythonスクリプトで指定されたインターフェイスを実装するすべてのクラスへのハンドルを取得するにはどうすればよいですか?

例:C#ですべてを行う場合、私は私を助けるために反射を持っており、アセンブリを突き出して次のようにすることができます:

    Assembly assembly = Assembly.LoadFrom("plugin.dll");
    Type[] types = assembly.GetTypes();
    foreach(Type type in types)
    {
        foreach(Type interfaceType in type.GetInterface())
        {
            if(interfaceType == typeof(IPlugin))
            {
                // gotcha, invoke interface specific methods
            }
        }
     }

アセンブリの代わりにIronPythonスクリプトを扱っている場合、どうすれば同じことができますか?ObjectOperationsとScriptScopeを使用すると、クラスの名前がわかっていれば(ここで説明します)、クラスへのハンドルを取得できることはわかっていますが、より堅牢なものを探しています。

4

4 に答える 4

3

あなたが抱えている問題は、IronPythonクラスが.NETクラスではないということです。PythonクラスはC#クラスよりもはるかに動的であるため、IronPythonクラスは通常.NETオブジェクトです。

IronPythonで.NETインターフェイスをサブクラス化すると、新しい.NETクラス作成されますが、実際には複数のPythonクラスがバッキング.NETクラスを共有します(IronPythonでサブクラス化された.NETタイプごとに1つの.NETクラスのみが作成されます)。

これを行う正しい方法は、Pythonイントロスペクションを使用してIronPythonクラスオブジェクトを収集し、それらをインスタンス化する必要があるファクトリ関数(デリゲートとして使用できます-返されたインスタンスをインターフェイスにキャストできます)を使用することです。

たとえば、Pythonスコープで実行してみることができます。

list_of_classes = IPlugin.\_\_subclasses_\_
于 2009-04-01T01:12:58.457 に答える
1

動的言語は通常、インターフェースを使用しません。非常に静的に型付けされた方法で考えています:)

事前定義されたインターフェイスと一致するかどうかを心配する代わりに、おそらくメンバー関数を呼び出して、スローされた例外を処理する必要があります。とにかくエラーを処理する必要があります。「期待するメソッド呼び出しに適合しません」もう1つになります。Objective-Cでは、これは「非公式プロトコル」と呼ばれます。

于 2009-03-31T05:15:12.063 に答える
1

clr.GetClrType を呼び出すことで、Python タイプのバッキング .NET タイプをいつでも取得できます。

Python.GetClrModule(engine) は clr モジュールを返し、それに対して GetClrType メソッドを呼び出して、objectoperations を使用して取得した Python クラスを渡します。これにより、System.Type が返されます。その後、通常どおり GetInterfaces メソッドを使用します。

于 2009-03-31T18:04:34.303 に答える
0

IronPython FAQ によると、*.py ファイルをアセンブリにコンパイルしてからリンクすることはサポートされていません。

http://ironpython.codeplex.com/Wiki/View.aspx?title=FAQ&referringTitle=ホーム

しかし、Paul は正しいです。この種の拡張性のために動的言語を使用する場合は、ランタイムからのインターフェイスを理解する必要はなく、ファイルを編集するだけで簡単にできるようにしたいと考えています。

この拡張ポイントをシステム管理者タイプに公開する場合は、PowerShell のホスティングを検討することをお勧めします。私はこれを行う方法について少し前に投稿を書きました:

http://notgartner.wordpress.com/2008/02/23/how-to-host-the-powershell-runtime/

PowerShell は、Exchange が使用されている環境で既に採用されているため、これには適しています。気をつけてください-私はPowerShellのファンなので、それを一粒の塩で取ってください:)

于 2009-03-31T05:37:29.873 に答える