IronPython "cannot import name ClassName"

IronPython "cannot import name ClassName"

我正在使用 IronPython 从我的 C# 应用程序执行 python 脚本。除了一些用于从脚本创建表单的系统 classes 之外,我还希望脚本访问我的 C# classes。以下是在 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);

程序在我脚本的这一行失败,返回 "Cannot import name MyClass":

from MyApp import MyClass

我的文件层次结构如下所示:

root folder
    -MyApp.exe
    -python
        -test.py

程序可以毫无问题地添加对我的 .exe 文件的引用,但不会加载 class。更令人费解的是这有效:

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(){}
    }
}

通过更多的研究,我找到了这篇帮助我解决问题的文章:Accessing C# class members in IronPython

MyClass 是使用隐式默认 "internal" 可见性定义的,因此它对我的程序集外部的 python 脚本不可见。将 MyClass 的可见性更改为 "public",如下所示:

namespace MyApp{
    public class MyClass{
        public static void MethodIWantToUse(){}
    }
}

...允许我通过键入以下内容将 class 导入到我的 python 脚本中:

from MyApp import MyClass

从而从命名空间 MyApp 导入 MyClass,它包含在 MyApp 程序集中。

(我还了解到 "import MyApp" 正在从我的程序集中导入名称空间 MyApp,它恰好具有相同的名称。)