2017-10-10 88 views
1

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

回答

0

通過一些調查研究,我設法找到這篇文章它幫助我解決我的問題: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,它碰巧具有相同的名稱。)