gpt4 book ai didi

mef - 使用 MEF 导入由 IronPython 或其他 DLR 语言导出的组件?

转载 作者:行者123 更新时间:2023-12-01 10:58:24 25 4
gpt4 key购买 nike

是否可以将 IronPython 类声明为“导出”,从而将它们添加到 MEF 目录中主机 C# 应用程序可以导入吗?

我真的找不到任何具体的例子,只是猜测。

以下是我如何手动加载实现 .NET 接口(interface)的 Python 类:

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

我希望能够像在 C# 中那样为 python 类添加属性。(或类似的东西)

有人试过吗?

谢谢,乔希

最佳答案

对于那些感兴趣的人,我在 GitHub 上找到了一个已经做到这一点的项目,但有点耦合到项目中。经作者批准,我创建了一个新的 repo 协议(protocol),IronPythonMef , 和一个 NuGet package

有补充讨论in this thread在 GitHub。

这是它如何工作的一个例子:

首先是在C#中声明的一个接口(interface):

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

在 C# 中导出该接口(interface)的实现:

[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"; }
}
}

并且,IOperation 在 IronPython 中的实现:

@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]);
}
}

关于mef - 使用 MEF 导入由 IronPython 或其他 DLR 语言导出的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com