Использование 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.
- Внедрите все сторонние сборки, от которых вы зависите, в Ресурсы вашего приложения.
- Зарегистрировать
ResolveEventHandler
сAppDomain.CurrentDomain.AssemblyResolve
событие. - Когда ваш обработчик вызывается со сборкой, которую вы спрятали в Ресурсах, загрузите сборку.
Вы делаете часть 3 следующим образом:
var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));
Если вам нужна дополнительная помощь, вы можете покопаться в LINQPad.exe и посмотреть на LinqPad.Program.AddLINQPadAssemblyResolver()
а также LinqPad.Program.FindAssem()
,
Обновление: только что нашел пост в блоге Джеффри Рихтера, который дает более подробную информацию об этом подходе.