2009-08-27 89 views
2

我開始研究IronPython,針對特定任務和臨時進程的.NET程序集開發腳本。與使用.NET控制檯應用程序項目處理此問題相比,我喜歡使用IronPython進行開發並且佔用空間小。但是,我立即遇到了來自app.config文件的設置障礙。我打算使用的程序集需要app.config文件中的設置,例如數據庫連接字符串,應用程序設置等。我在SO How to use IronPython with App.Config上看到了這個問題。但是,從我所收集和假設的情況來看,沒有任何建議的解決方案起作用或可以接受。修改ipy.exe.config文件有潛力。但是,我想盡可能簡化並儘量減少依賴性。這樣任何人都可以抓取IronPython腳本並運行它,而無需修改ipy.exe.config文件。使用IronPython專門針對.NET程序集編寫代碼的問題

因此我決定嘗試以下操作:我在腳本中創建一個新的應用程序域,並且指向app.config文件的地址爲AppDomainSetup.ConfigurationFile。然後,我可以撥打AppDomain.DoCallBack並通過一個有我的邏輯的代表。所以下面是我的嘗試的腳本。請注意,我只是在學習IronPython/Python,請記住這一點。

import clr 
import sys 
sys.path.append(r"C:\MyApp"); 
clr.AddReference("System") 
clr.AddReference("Foo.dll") 

from System import * 
from System.IO import Path 
from Foo import * 

def CallbackAction(): 
    print "Callback action"  

baseDirectory = r"C:\MyApp" 
domainInfo = AppDomainSetup() 
domainInfo.ApplicationBase = baseDirectory 
domainInfo.ConfigurationFile = Path.Combine(baseDirectory,"MyApp.exe.config") 
appDomain = AppDomain.CreateDomain("Test AppDomain",AppDomain.CurrentDomain.Evidence,domainInfo) 

appDomain.DoCallBack(CallbackAction) #THIS LINE CAUSES SERIALIZATION EXCEPTION 

Console.WriteLine("Hit any key to exit...") 
Console.ReadKey() 

在上面的代碼中,「c:\ MyApp」文件夾包含所有內容; exe,dll和app.config文件。希望第二個appDomain將使用MyApp.exe.config。 CallbackAction方法旨在包含將使用.NET程序集中的api來執行一些工作的代碼。 CallbackAction將通過appDomain.DoCallBack調用。那麼,這是我遇到問題的部分。當執行appDoming.DoCallBack,我得到一個System.Runtime.Serialization.SerializationException:

無法序列的 代表創作者的裝配外超過 非託管函數指針的代表,動態 方法或方法。

我不能完全理解這一點。我假設有人試圖通過appDomain序列化,並且操作失敗。我可以創建一個CrossAppDomainDelegate並執行它。

test = CrossAppDomainDelegate(lambda: CallbackAction()) 
test() 

那麼有沒有人有任何想法或建議?基本上,我需要讓我想在IronPython中編寫的程序集有權訪問app.config文件。

感謝您的時間和建議提前。

btw我安裝了IronPyhton 2.0.1並使用VS2008 Pro。

回答

0

這可能不是您正在尋找的答案,但是....因爲這是您自己的測試目的,所以我建議安裝Ironpython 2.7.1並查看問題是否仍然存在。 Ironpython自2.0.1以來已經有很多改進。