C#/IronPython与共享C#类库的互操作
我试图使用IronPython作为C#GUI和一些C#库之间的中介,以便在编译后编写脚本 我有一个GUI和python都使用的类库DLL,它与以下内容类似:C#/IronPython与共享C#类库的互操作,c#,interop,ironpython,c#-4.0,C#,Interop,Ironpython,C# 4.0,我试图使用IronPython作为C#GUI和一些C#库之间的中介,以便在编译后编写脚本 我有一个GUI和python都使用的类库DLL,它与以下内容类似: namespace MyLib { public class MyClass { public string Name { get; set; } public MyClass(string name) { this.Name = name;
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")
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 ")
然后,在C#中,我将其称为:
import clr
clr.AddReferenceToFile(r"MyLib.dll")
from MyLib import MyClass
ReturnObject = MyClass("Test")
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 ")
因此,您可以看到类名是完全相同的,但出于某种原因,它认为它们是不同的
DLL与.py文件位于不同的目录中(我只是懒得写出所有的路径设置内容),IronPython的解释器将这些对象视为不同对象是否存在问题,因为解释器将它们视为处于不同的上下文或范围中?您可以尝试在调试器下运行程序,并在GetVariable调用之前中断执行。转到“模块”窗口,查看是否加载了两个版本的C#类库DLL。如果是这样的话,那就是原因
如果这就是问题所在,那么解决方案就是确保C#和Python世界在类型上达成一致。一种解决方案是将所有内容放在同一个目录中。另一种可能是在C#中设置对类库的引用,方法是使用ScriptScope类上的属性(我认为)设置对Python代码可用的类库程序集的程序集引用。我没有立即可用的混合C#/IronPython项目可供测试,但我记得看到了该功能。此错误表示程序集正在加载到多个CLR加载程序上下文中。您可以切换到clr.AddReference或从C#加载程序集,而不是使用clr.AddReferenceToFile添加引用。对于前者,您需要确保程序集在.NET可以正常加载的地方可用(GAC或进程的应用程序库)。对于后者,您只需执行以下操作:
engine.Runtime.LoadAssembly(typeof(MyClass).Assembly);
从你的C#主机代码。就我个人而言,我更喜欢第二个解决方案,因为它不仅可以工作,而且还可以让用户不必从Python中调用clr.AddRef