我正在使用IronPython从我的C#应用程序执行python脚本。除了一些用于从脚本创建表单的System类之外,我希望脚本能够访问我的C#类。以下是在python脚本中完成的导入:
import clr
clr.AddReference('MyApp')
from MyApp import MyClass
我从C#执行脚本如下:
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.ExecuteFile(Directory.GetCurrentDirectory()+"/python/test.py", scope);
程序在我的脚本的这一行失败,返回“无法导入名称MyClass”:
from MyApp import MyClass
我的文件层次结构如下所示:
root folder
-MyApp.exe
-python
-test.py
程序添加对我的.exe文件的引用没有问题,但它不会加载该类。更令人费解的是,这有效:
import MyApp
以上行是否从我的程序集“MyApp”导入我的命名空间,也称为“MyApp”?我尝试从命名空间MyApp中删除MyClass,但这没有改变。我尝试将MyApp构建为.dll并将其插入根目录和脚本目录中,但即使经过长时间的互联网浏览,也没有任何效果。
为什么IronPython无法找到MyClass?为什么它从MyApp成功导入MyApp,当发生这种情况时它实际上在做什么?
MyClass.cs:
// Omitted "using" statements
namespace MyApp{
class MyClass{
public static void MethodIWantToUse(){}
}
}
答案 0 :(得分:0)
通过更多的研究,我设法找到了帮助我解决问题的文章:Accessing C# class members in IronPython
MyClass是使用隐式默认“内部”可见性定义的,因此对于程序集外部的python脚本不可见。将MyClass的可见性改为“公共”,如下所示:
namespace MyApp{
public class MyClass{
public static void MethodIWantToUse(){}
}
}
...允许我输入以下内容将类导入我的python脚本:
from MyApp import MyClass
从MyApp程序集中包含的名称空间MyApp导入MyClass。
(我还了解到“import MyApp”正在从我的程序集中导入名称空间MyApp,它恰好具有相同的名称。)