Проблема использования IronPython для кодирования против сборок .NET, особенно с аспектом app.config - PullRequest
2 голосов
/ 27 августа 2009

Я начал изучать IronPython для разработки сценариев для моих сборок .NET для определенных задач и специальных процессов. Мне нравится простота разработки с IronPython и небольшая занимаемая площадь по сравнению с обработкой проекта консольного приложения .NET. Однако я сразу же наткнулся на контрольно-пропускной пункт с настройками из файла app.config. Сборки, которые я планирую использовать, требуют настройки из файла app.config, например строки подключения к базе данных, настроек приложения и т. Д. Я видел этот вопрос на SO Как использовать IronPython с App.Config . Однако, насколько я понимаю, ни одно из предложенных решений не работало и не было приемлемым. Изменение файла ipy.exe.config имеет потенциал. Тем не менее, я хотел бы сохранить это как можно более простым и минимизировать зависимости. Чтобы любой мог получить скрипт IronPython и запустить его без изменения файла ipy.exe.config.

Поэтому я решил попробовать следующее: я создаю новый домен приложения в сценарии и должен AppDomainSetup.ConfigurationFile указать файл app.config. Тогда я мог бы вызвать AppDomain.DoCallBack и передать делегата, который имеет мою логику. Итак, ниже приведен сценарий с моей попыткой. Обратите внимание, что я только изучаю IronPython / Python, так что имейте это в виду.

import clr
import sys
sys.path.append(r"C:\MyApp");
clr.AddReference("System")
clr.AddReference("Foo.dll")

from System import *
from System.IO import Path
from Foo import *

def CallbackAction():
    print "Callback action"    

baseDirectory = r"C:\MyApp"
domainInfo = AppDomainSetup()
domainInfo.ApplicationBase = baseDirectory
domainInfo.ConfigurationFile = Path.Combine(baseDirectory,"MyApp.exe.config")
appDomain = AppDomain.CreateDomain("Test AppDomain",AppDomain.CurrentDomain.Evidence,domainInfo)

appDomain.DoCallBack(CallbackAction)  #THIS LINE CAUSES SERIALIZATION EXCEPTION

Console.WriteLine("Hit any key to exit...")
Console.ReadKey()

В приведенном выше коде папка "c: \ MyApp" содержит все; exe, dll и файл app.config. Надеемся, что второй appDomain будет использовать MyApp.exe.config. Метод CallbackAction предназначен для того, чтобы содержать код, который будет использовать API из сборок .NET для выполнения некоторой работы. CallbackAction будет вызываться через appDomain.DoCallBack. Ну, это часть, у меня возникла проблема. Когда appDoming.DoCallBack выполняется, я получаю System.Runtime.Serialization.SerializationException:

Невозможно сериализовать делегатов указатели неуправляемых функций, динамические методы или методы вне собрание создателя делегата.

Я не могу в этом разобраться. Я предполагаю, что что-то пытается быть сериализовано через домены приложения, и эта операция не выполняется. Я могу создать CrossAppDomainDelegate и выполнить его просто отлично.

test = CrossAppDomainDelegate(lambda: CallbackAction())
test()

Так у кого-нибудь есть идеи или рекомендации? По сути, мне нужно иметь сборки, которые я хочу кодировать в IronPython, чтобы иметь доступ к файлу app.config.

Спасибо за ваше время и рекомендации заранее.

Кстати, у меня установлен IronPyhton 2.0.1, и я использую VS2008 Pro.

1 Ответ

0 голосов
/ 10 января 2012

Вероятно, это не тот ответ, который вы ищете, но .... Поскольку это для ваших собственных целей тестирования, я бы порекомендовал установить Ironpython 2.7.1 и посмотреть, не исчезнет ли проблема. Начиная с 2.0.1 в Ironpython было много улучшений.

...