2009-01-23 71 views
4

一是一些背景(櫃面它可以幫助):問題與在C#的Web應用程序中嵌入的IronPython 2

我的應用程序是一個基於Web的框架,最近升級到.NET Framework V3.5的但不使用母版頁/用戶控制系統。它更類似於MVC模式(雖然年代久遠),並且從模板輸出純HTML到響應流。 Python表達式允許實現一些規則和模板變體。

舊的方式

當嵌入在C#IronPython的1.x的引擎,我們能夠做的代碼,如:

PythonEngine pe = new PythonEngine(); 
Assembly a = Assembly.LoadFile("path to assembly"); 
pe.LoadAssembly(a); 
pe.Import("Script"); 

存在IPY 2.0沒有導入()方法並且ImportModule()方法似乎不以相同的方式工作。導入()緩解了需要把線在我們寫每一個python腳本,如:

from MyAssembly import MyClass 

的事實,MyClass的是充滿了靜態方法,手段,調用MyClass.MyMethod()工作非常好。我不能僅僅實例化一個對象,並將它分配給作用域中的一個變量,因爲MyClass所在的程序集在運行時動態加載。

我們

我已經整理出來的IronPython 2.0的集成的所有其他部分,但寧願不要求我的實施者「從MyAssembly程序導入MyClass的」請在每個腳本的頂部的問題他們寫道(只是在ipy 1.x中沒有必要時才顯得很愚蠢),並且很可能成爲一段時間的支持問題。

最後的問題

有沒有人有這個問題,並解決它?我是否在爲DLR做錯事情?還是我錯過了明顯的東西?

我不確定需要幫助的人的詳細信息,但我希望這已經足夠。

回答

6

一旦裝配的加載,可以執行在進口Scope您使用的是運行腳本:

ScriptEngine engine = Python.CreateEngine(); 
engine.Runtime.LoadAssembly(a); 
string code = "from MyAssembly import MyClass"; 
ScriptSource source = engine.CreateScriptSourceFromString(code, "<import>", SourceCodeKind.Statements); 
CompiledCode c = source.Compile(); 

Scope scope = engine.CreateScope(); 
c.Execute(scope); 

// then run your script in the same scope 

我們做我們的產品類似的東西。

(希望這是有效的C# - 其實,我試圖在IronPython的本身,因爲它是方便多了。)

1

感謝威爾伯福斯,

最後我做了以下內容:

Assembly a = Assembly.LoadFile("path to assembly"); 
object var = a.CreateInstance("MyNamespace.MyClass"); 

Scope.SetVariable("MyClass", var); 

這在C#中創建了我的類的對象,然後將它作爲變量傳遞給IronPython作用域。

請注意,這是在C#範圍(AppDomain)中創建對象並將其傳遞給IronPython。這似乎(到目前爲止)爲我的問題工作,因爲我傳遞的對象充滿了只有靜態方法,但可能不適用於具有狀態的類。

相關問題