IronPython“无法导入名称ClassName”

时间:2017-10-10 02:31:25

标签: c# ironpython

我正在使用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(){}
    }
}

1 个答案:

答案 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,它恰好具有相同的名称。)