Использование ILMerge с IronPython

У меня проблемы с объединением 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 ответ

Решение

К сожалению, кажется, что чрезвычайно динамичные среды выполнения, такие как 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(),

Обновление: только что нашел пост в блоге Джеффри Рихтера, который дает более подробную информацию об этом подходе.

Другие вопросы по тегам