导入组件到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的要求,你需要和有每个模块导入一个文件。导入机制将执行适当的缓存,因此它只会加载一次,但会确保所有程序集都可用于需要它们的每个模块。

+0

迪诺,我决定试试你写的是第一种方法:创建一个模块。到目前为止,这解决了我的一半问题。所以,下面这个技术,我模块的初始化,需要注意的做“clr.AddReferenceToFileAndPath”的等价的,但其余部分我还需要支付:“进口MyAssembly的”做的等价物。我如何才能在模块中实现“导入”? – namenlos 2010-10-20 15:52:21

+0

你可以做的是一样的东西: – 2010-10-22 18:18:13

+0

这样做将是从组件获得出口类型的粗略方法(有上装配对象的方法来做到这一点),然后调用DynamicHelpers.GetPythonTypeFromType每种类型和坚持的结果到PerformModuleReload给你的字典中。然后你的用户可以从mymodule import *中完成,他们会得到程序集中的所有东西。 – 2010-10-22 18:21:20