Ada*_*ile 6 c# ironpython interop c#-4.0
我正在尝试使用IronPython作为C#GUI和一些C#库之间的中介,以便它可以在编译后编写脚本.
我有一个类库DLL,由GUI和python使用,是这样的:
namespace MyLib
{
public class MyClass
{
public string Name { get; set; }
public MyClass(string name)
{
this.Name = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
IronPython代码如下:
import clr
clr.AddReferenceToFile(r"MyLib.dll")
from MyLib import MyClass
ReturnObject = MyClass("Test")
Run Code Online (Sandbox Code Playgroud)
然后,在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 ")
Run Code Online (Sandbox Code Playgroud)
当我调用最后一段代码时,source.Execute(scope)运行成功返回,但是当我尝试GetVariable调用时,它抛出以下异常
Microsoft.Scripting.ArgumentTypeException: expected MyClass , got MyClass
Run Code Online (Sandbox Code Playgroud)
所以,你可以看到类名完全相同,但由于某种原因,它认为它们是不同的.
DLL与.py文件位于不同的目录中(我只是没有写出所有路径设置的东西),可能是因为IronPython的解释器存在问题,因为它看起来不同,因为它是某种方式看到他们处于不同的背景或范围?
Din*_*and 11
此错误表示您的程序集已加载到多个CLR加载程序上下文中.您可以切换到clr.AddReference,也可以从C#加载程序集,而不是使用clr.AddReferenceToFile添加引用.对于前者,您需要确保程序集在.NET可以正常加载的位置(GAC或进程的应用程序库)中可用.对于后者你可以这样做:
engine.Runtime.LoadAssembly(typeof(MyClass).Assembly);
Run Code Online (Sandbox Code Playgroud)
来自您的C#主机代码.就个人而言,我更喜欢这个第二个解决方案,因为它不仅可以帮助您节省用户从Python进行clr.AddRef调用.
| 归档时间: |
|
| 查看次数: |
2118 次 |
| 最近记录: |