Импорт сборок в IronPython из другой сборки - PullRequest
1 голос
/ 06 октября 2010

У меня есть сценарий IronPython 2.6 / 2.7, который я пишу, который импортирует много сборок.

Другими словами, в верхней части скрипта это делается ...

clr.AddReference( "System.Xml" )
import System.Xml

За исключением того, что он делает это не для 1 сборки, а для 10 сборок.

Некоторые из модулей являются встроенными сборками .NET, а некоторые являются сборками, которые я сделал.

Я бы хотел упростить мой скрипт, чтобы он загружал одну сборку, которую я буду собирать. Затем я хочу вызвать метод в этой сборке, который будет выполнять «AddReference» и «импорт» для 10 сборок. Основная цель всего этого - минимизировать длину / сложность сценария.

Так что в конце я бы увидел, как это работает

clr.AddReferenceToFileAndPath( "d:\\myassembly" )
import MyAssembly
MyAssembly.ImportAllAssembliesIReallyWant()

Моя основная проблема - несмотря на чтение всей информации, которую я мог найти в ScriptRuntime, ScriptEngine, областях и т. Д. - Я все еще не могу понять, как написать метод в «MyAssembly», который влияет на то, какие модули загружаются в вызывающем скрипте .

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Один из способов сделать это - создать встроенный модуль, который делает это.Вы можете сделать это с помощью:

[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, и иметь каждый модульимпортировать этот один файл.Механизм импорта будет выполнять соответствующее кэширование, поэтому он будет загружаться только один раз, но обеспечит доступность всех сборок для каждого модуля, который нуждается в них.

0 голосов
/ 08 октября 2010

Я думаю, что единственный способ сделать это - получить доступ к ScriptEngine из вашего метода ImportAllAssemblies () и выполнить команды, которые обычно выполняются.Вы должны быть в состоянии динамически генерировать операторы, основываясь на том, какие сборки вы хотите загрузить, на какие ссылки и т. Д.

Надеюсь, что это поможет вам указать правильное направление.

...