我正在编写一个IronPython 2.6 / 2.7脚本,它导入了很多程序集。
换句话说,在脚本顶部执行此操作......
clr.AddReference( "System.Xml" )
import System.Xml
除了它不是为1个组件执行此操作,而是为10个组件执行此操作。
有些模块是内置的.NET程序集,有些是我已经完成的程序集。
我想简化我的脚本,以便加载我将构建的一个程序集。我想在该程序集中调用一个方法,该方法将对10个程序集执行“AddReference”和“import”。所有这一切的主要目标是最小化脚本的长度/复杂性。
所以最后我会看到它像这样工作
clr.AddReferenceToFileAndPath( "d:\\myassembly" )
import MyAssembly
MyAssembly.ImportAllAssembliesIReallyWant()
我的核心问题尽管阅读了我在ScriptRuntime,ScriptEngine,scopes等上可以找到的所有信息 - 我仍然无法弄清楚如何在“MyAssembly”中编写一个方法来影响调用脚本中加载的模块
答案 0 :(得分:2)
解决这个问题的一种方法是创建一个内置模块来执行此操作。你可以这样做:
[assembly: PythonModule("mymodule", typeof(MyModuleType)]
public static class MyModuleType {
[SpecialName]
public static void PerformModuleReload(PythonContext context, PythonDictionary dict) {
context.DomainManager.LoadAssembly(typeof(TypeInAssemblyToLoad));
}
}
只需为您关心的所有程序集添加适当的LoadAssembly调用。该程序集还可以在dict中填充您想要的成员。
另一种(也可能更简单)方法是简单地使用.py文件来执行所需的所有clr.AddReference调用,并让每个模块导入一个文件。导入机制将执行适当的缓存,因此它只会加载一次,但会确保所有程序集都可用于需要它们的每个模块。
答案 1 :(得分:0)
我认为唯一的方法是从ImportAllAssemblies()方法中访问ScriptEngine并执行通常会执行的命令。您应该能够根据要加载的程序集和引用的程序集等动态生成语句。
希望这有助于指明你正确的方向。