IronPython“无法导入名称ClassName”

问题描述:

我正在使用IronPython从我的C#应用​​程序执行python脚本。我想让脚本访问我的C#类以及一些用于从脚本创建表单的System类。以下是python脚本内完成进口:IronPython“无法导入名称ClassName”

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

通过一些调查研究,我设法找到这篇文章它帮助我解决我的问题:Accessing C# class members in IronPython

MyClass的是与隐含的默认“内部”的可见性定义,所以它对我的程序集外部的python脚本是不可见的。更改为MyClass可见性为“公共”,例如:

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

...让我通过键入导入类为我的python脚本:从命名空间MyApp的,

from MyApp import MyClass 

因此进口MyClass的这包含在MyApp程序集中。

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