导入组件到IronPython的从另一个组件
问题描述:
我有一个IronPython的2.6/2.7剧本我写其中进口大量的组件。导入组件到IronPython的从另一个组件
换句话说,在它这个脚本的顶部...
clr.AddReference("System.Xml")
import System.Xml
只是它不用于1个装配做到这一点,但对于10个集。
一些模块是内置的.NET assembllies的,有些是我做组件。
我想,以便它加载一个程序集,我将建立简化我的剧本。然后我想调用该程序集中的一个方法,该方法将为10个程序集执行“AddReference”和“import”。所有这些的主要目标是最小化脚本的长度/复杂性。
所以在最后我会看到它这样工作
clr.AddReferenceToFileAndPath("d:\\myassembly")
import MyAssembly
MyAssembly.ImportAllAssembliesIReallyWant()
我的核心problemis尽管阅读所有我能找到的ScriptRuntime,ScriptEngine的,范围等信息 - 我仍然想不通如何在“MyAssembly”中编写一个影响调用脚本中加载哪些模块的方法。
答
我认为要做到这一点的唯一方法将是从您的ImportAllAssemblies()方法中访问,该ScriptEngine和执行通常会被执行的命令。你应该能够动态生成基于要加载哪些组件的声明和引用等
希望帮助你指出正确的方向。
答
一个去了解这个方法是创建一个内置模块,做到这一点。您可以这样做:
[assembly: PythonModule("mymodule", typeof(MyModuleType)]
public static class MyModuleType {
[SpecialName]
public static void PerformModuleReload(PythonContext context, PythonDictionary dict) {
context.DomainManager.LoadAssembly(typeof(TypeInAssemblyToLoad));
}
}
只需为您关心的所有程序集添加适当的LoadAssembly调用即可。程序集还可以填充你想要的字典中的成员。
另一个(以及可能的更简单)的方式是简单地有一个.py文件,其完成所有clr.AddReference的要求,你需要和有每个模块导入一个文件。导入机制将执行适当的缓存,因此它只会加载一次,但会确保所有程序集都可用于需要它们的每个模块。
迪诺,我决定试试你写的是第一种方法:创建一个模块。到目前为止,这解决了我的一半问题。所以,下面这个技术,我模块的初始化,需要注意的做“clr.AddReferenceToFileAndPath”的等价的,但其余部分我还需要支付:“进口MyAssembly的”做的等价物。我如何才能在模块中实现“导入”? – namenlos 2010-10-20 15:52:21
你可以做的是一样的东西: – 2010-10-22 18:18:13
这样做将是从组件获得出口类型的粗略方法(有上装配对象的方法来做到这一点),然后调用DynamicHelpers.GetPythonTypeFromType每种类型和坚持的结果到PerformModuleReload给你的字典中。然后你的用户可以从mymodule import *中完成,他们会得到程序集中的所有东西。 – 2010-10-22 18:21:20