【问题标题】:Importing assemblies into IronPython from another assembly将程序集从另一个程序集导入 IronPython
【发布时间】:2013-01-08 11:32:14
【问题描述】:

我正在编写一个 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、范围等的所有信息 - 我仍然无法弄清楚如何在“MyAssembly”中编写一个影响调用脚本中加载哪些模块的方法.

【问题讨论】:

    标签: c# assemblies module ironpython loading


    【解决方案1】:

    解决此问题的一种方法是创建一个执行此操作的内置模块。你可以这样做:

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

    【讨论】:

    • Dino,我决定试试你写的第一种方法:创建一个模块。到目前为止,这解决了我的一半问题。因此,在我的模块的初始化中遵循这种技术,它负责执行与“clr.AddReferenceToFileAndPath”等效的操作,但我仍然需要涵盖的剩余部分:执行与“import MyAssembly”等效的操作。如何在模块中实现“导入”?
    • 你可以做的是这样的:
    • 一种粗略的方法是从程序集中获取导出的类型(程序集对象上有一个方法可以做到这一点),然后为每种类型调用 DynamicHelpers.GetPythonTypeFromType 并将结果粘贴到PerformModuleReload 给你的字典。然后您的用户可以从 mymodule import * 执行操作,他们将获得程序集中的所有内容。
    【解决方案2】:

    我认为这样做的唯一方法是从 ImportAllAssemblies() 方法中访问 ScriptEngine 并执行通常会执行的命令。您应该能够根据要加载的程序集和引用的程序集等动态生成语句。

    希望能帮助您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多