我开始研究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。
答案 0 :(得分:0)
这可能不是您正在寻找的答案,但是......由于这是出于您自己的测试目的,我建议安装Ironpython 2.7.1并查看问题是否仍然存在。自2.0.1以来,Ironpython已经有了很多改进。