使用IronPython来编写特定于app.config方面的.NET程序集的问题

时间:2009-08-27 01:43:24

标签: c# .net ironpython

我开始研究IronPython,针对某些任务和临时流程针对我的.NET程序集开发脚本。我喜欢使用IronPython轻松开发,与使用.NET控制台应用程序项目处理这一点相比,占用空间小。但是,我立即遇到了来自app.config文件设置的包版广告。我打算使用的程序集需要app.config文件中的设置,例如数据库连接字符串,应用程序设置等。我在SO How to use IronPython with App.Config上看到了这个问题。但是,根据我的收集和假设,没有一个建议的解决方案有效或可接受。修改ipy.exe.config文件有潜力。但是,我希望尽可能简化并尽量减少依赖关系。这样任何人都可以获取IronPython脚本并运行它而无需修改ipy.exe.config文件。

所以我决定尝试以下操作:在脚本中创建一个新的应用程序域,并使AppDomainSetup.ConfigurationFile指向app.config文件。然后我可以调用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,dlls和app.config文件。希望第二个appDomain将使用MyApp.exe.config。 CallbackAction方法旨在包含将使用.NET程序集中的api执行某些工作的代码。 CallbackAction将通过appDomain.DoCallBack调用。嗯,这是我遇到问题的部分。当appDoming.DoCallBack被执行时,我得到一个System.Runtime.Serialization.SerializationException:

  

无法序列化代表   非托管函数指针,动态   外面的方法或方法   代表创作者的集会。

我无法完全理解这一点。我假设正在尝试跨appDomains序列化某些内容并且该操作失败。我可以创建一个CrossAppDomainDelegate并执行它就好了。

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

那么有人有任何想法或建议吗?基本上,我需要在IronPython中让我想要编码的程序集能够访问app.config文件。

提前感谢您的时间和建议。

顺便说一下我安装了IronPyhton 2.0.1并且正在使用VS2008 Pro。

1 个答案:

答案 0 :(得分:0)

这可能不是您正在寻找的答案,但是......由于这是出于您自己的测试目的,我建议安装Ironpython 2.7.1并查看问题是否仍然存在。自2.0.1以来,Ironpython已经有了很多改进。