Использование ILMerge с IronPython - PullRequest
2 голосов
/ 21 января 2012

У меня проблемы со слиянием IronPython.dll, IronPython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.dll и Microsoft.Scripting.Metadata.dll в мое приложение.

Первая ошибкаполучено при попытке выполнить скрипт Python:

MissingMemberException: «У объекта« NullImporter »нет атрибута« find_module »»

Это было решено пропуском / internalizeПараметр ILMerge.Похоже, что IronPython нужны определенные типы, чтобы быть публичными, чтобы функционировать.

Но это не сильно помогло, теперь я получил:

ImportException: "Нет модуля с именем clr"

Исключение в обоих случаях выдается для первой строки моего скрипта, которая, конечно, является просто "import clr".

1 Ответ

2 голосов
/ 22 января 2012

К сожалению, кажется, что чрезвычайно динамичные среды выполнения, такие как IronPython, будут наименее кооперативными, когда дело доходит до работы после ILMerge.

Вы могли бы подумать о выполнении некоторых приемов встраивания сборок, которые выполняются в одиночном исполнении.такие проекты, как LINQPad.

  1. Встраивание всех сторонних сборок, от которых вы зависите, в ресурсы вашего приложения.
  2. Зарегистрируйте ResolveEventHandler вAppDomain.CurrentDomain.AssemblyResolve событие.
  3. Когда ваш обработчик вызывается со сборкой, которую вы спрятали в Ресурсы, загрузите сборку.

Вы выполняете часть 3 следующим образом:

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));

Если вам нужна дополнительная помощь, вы можете поискать в LINQPad.exe и посмотреть LinqPad.Program.AddLINQPadAssemblyResolver() и LinqPad.Program.FindAssem().

Обновление: Простонашел сообщение в блоге Джеффри Рихтера , в котором дается более подробная информация об этом подходе.

...