Использование 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»

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


person Marcel    schedule 21.01.2012    source источник


Ответы (1)


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

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

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

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

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

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

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

person sblom    schedule 22.01.2012
comment
Кажется, это способ сделать это. Из комментариев к сообщению в блоге, на которое вы ссылаетесь: Как автор ILMerge, я думаю, что это фантастика! Если бы я знал об этом, я бы никогда не написал ILMerge. - person Marcel; 22.01.2012