3

IronPythonクラスを「エクスポート」として宣言し、ホストC#アプリケーションがインポートできるMEFカタログに追加することは可能ですか?

私はこれの具体的な例を実際に見つけることができず、ただ推測しているだけです。

.NETインターフェイスを実装するPythonクラスを手動でロードした方法は次のとおりです。

https://github.com/versionone/VersionOne.SDK.Experimental

C#で行うのと同じように、Pythonクラスに属性を設定できるようにしたいと思います。(または同等のもの)

誰かがこれを試しましたか?

ありがとう、ジョシュ

4

1 に答える 1

6

興味のある人のために、私はこれを行ったGitHubのプロジェクトを見つけましたが、プロジェクトに少し結合されていました。著者の承認を得て、新しいリポジトリ、IronPythonMef、およびそのためのNuGetパッケージを作成しました。

GitHubのこのスレッドには、追加のディスカッションがあります。

仕組みの例を次に示します。

まず、C#で宣言されたインターフェイス:

namespace IronPythonMef.Tests.Example.Operations
{
    public interface IOperation
    {
        object Execute(params object[] args);
        string Name { get; }
        string Usage { get; }
    }
}

そのインターフェイスをC#でエクスポートする実装:

[Export(typeof(IOperation))]
public class Power : IOperation
{
    public object Execute(params object[] args)
    {
        if (args.Length < 2)
        {
            throw new ArgumentException(Usage, "args");
        }

        var x = Convert.ToDouble(args[0]);
        var y = Convert.ToDouble(args[1]);

        return Math.Pow(x, y);
    }

    public string Name
    {
        get { return "pow"; }
    }

    public string Usage
    {
        get { return "pow n, y -- calculates n to the y power"; }
    }
}

そして、IronPythonでのIOperationの実装:

@export(IOperation)
class Fibonacci(IOperation):
    def Execute(self, n):
        n = int(n)
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return self.Execute(n-1) + self.Execute(n-2)

    @property
    def Name(self):
        return "fib"

    @property
    def Usage(self):
        return "fib n -- calculates the nth Fibonacci number"

そして、C#とIronPythonの両方からこれらの操作をインポートして実行するクラスのテストケースを次に示します。

[TestFixture]
public class MathWizardTests
{
    [Test]
    public void runs_script_with_operations_from_both_csharp_and_python()
    {
        var mathWiz = new MathWizard();

        new CompositionHelper().ComposeWithTypesExportedFromPythonAndCSharp(
            mathWiz,
            "Operations.Python.py",
            typeof(IOperation));

        const string mathScript =
@"fib 6
fac 6
abs -99
pow 2 4
";
        var results = mathWiz.ExecuteScript(mathScript).ToList();

        Assert.AreEqual(8, results[0]);
        Assert.AreEqual(720, results[1]);
        Assert.AreEqual(99f, results[2]);
        Assert.AreEqual(16m, results[3]);
    }
}      
于 2012-11-12T21:25:47.640 に答える