gpt4 book ai didi

C#/IronPython 与共享 C# 类库的互操作

转载 作者:太空狗 更新时间:2023-10-29 21:07:14 24 4
gpt4 key购买 nike

我正在尝试使用 IronPython 作为 C# GUI 和一些 C# 库之间的中介,以便它可以在编译后编写脚本。

我有一个由 GUI 和 python 使用的类库 DLL,大致如下:

namespace MyLib
{
public class MyClass
{
public string Name { get; set; }
public MyClass(string name)
{
this.Name = name;
}
}
}

IronPython代码如下:

import clr
clr.AddReferenceToFile(r"MyLib.dll")
from MyLib import MyClass

ReturnObject = MyClass("Test")

然后,在 C# 中我会这样调用它:

ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = null;

scope = engine.CreateScope();
ScriptSource source = engine.CreateScriptSourceFromFile("Script.py");

source.Execute(scope);

MyClass mc = scope.GetVariable<MyClass>("ReturnObject ")

当我调用最后一段代码时,source.Execute(scope) 运行成功返回,但是当我尝试调用 GetVariable 时,它​​抛出以下异常

Microsoft.Scripting.ArgumentTypeException: expected MyClass , got MyClass 

因此,您可以看到类名完全相同,但出于某种原因它认为它们不同。

DLL 与 .py 文件位于不同的目录中(我只是懒得写出所有路径设置内容),可能是 IronPython 的解释器将这些对象视为差异存在问题因为它以某种方式将它们视为处于不同的上下文或范围内?

最佳答案

此错误表明您的程序集正在加载到多个 CLR 加载程序上下文中。您可以切换到 clr.AddReference 或从 C# 加载程序集,而不是使用 clr.AddReferenceToFile 添加引用。对于前者,您需要确保程序集在 .NET 可以正常加载它的地方可用(GAC 或进程的应用程序库)。对于后者,你可以这样做:

engine.Runtime.LoadAssembly(typeof(MyClass).Assembly);

来自您的 C# 主机代码。就我个人而言,我更喜欢第二种解决方案,因为它不仅有效,而且让您的用户无需从 Python 执行 clr.AddRef 调用。

关于C#/IronPython 与共享 C# 类库的互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3009213/

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