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

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;

我试图使用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")
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