2015-06-16 4 views
2

Я создаю приложение, которое я хочу отправить как один exe, или как можно ближе. Сначала я пытался пакетирование все зависимости с помощью ILMerge, но обнаружил, что вызывает PostSharp на неудачу за исключением следующего:Проблемы с использованием PostSharp с ILMerge

System.TypeInitializationException: The type initializer for 'TestClass`1' threw an exception. 
---> System.TypeInitializationException: The type initializer for 'PostSharp.ImplementationDetails_5c83534c.<>z__a_1a' threw an exception. 
---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 
    at PostSharp.ImplementationDetails_5c83534c.<>z__a_1a..cctor() 
    --- End of inner exception stack trace --- 
    at PostSharp.ImplementationDetails_5c83534c.<>z__a_1a.Initialize() 
    at TestClass`1..cctor() in :line 0 

я нашел this blog post с 2008 годом проблем с использованием PostSharp с ILMerge, но они, кажется, сосредотачиваются вокруг прецедента который имеет несколько библиотек, в которых PostSharp объединяется с основным exe. Мой случай намного проще:

У меня есть один exe, который использует PostSharp, а также некоторые сторонние библиотеки, которые не используют PostSharp. В результате exe имеет то же имя, что и исходное, поэтому я считаю, что PostSharp должен иметь возможность находить классы.

Минимальный метод, который воспроизводит проблему, - это просто ILMerge для одного exe и оставить остальные зависимости в виде отдельных DLL-файлов. В этой игрушечной версии ILMerge бессмысленна - я просто запускаю ее над одним exe. Однако этого достаточно, чтобы воспроизвести проблему.

Если вместо запуска ILMerge я просто оставляю исходный exe отдельно, исключение не выбрасывается. Таким образом, ILMerge каким-то образом вмешивается в PostSharp. Вот командная строка мой процесс сборки с помощью:

ilmerge /out:Releases/Prowl-a6/Prowl.exe "/lib:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5" "/targetplatform:v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5" D:\Dropbox\Code\C#\Prowl\Prowl.exe 

Я использую PostSharp только в одном месте: у меня есть абстрактный класс атрибута, который реализует MethodInterceptionAspect, а затем два конкретных классов, которые расширяют его.

Любые идеи относительно того, что я мог бы сделать, чтобы сделать эту работу?

EDIT: после некоторого расследования я обнаружил, что ошибка возникает только при создании экземпляра универсального класса, который содержит один из методов MethodInterceptionAspects. Ненормированные - прекрасные. Here - это минимальное решение, демонстрирующее ошибку.

+1

Какую версию PostSharp вы используете? Я создал консольный проект под VS2013, добавил PostSharp 4.1.15, создал абстрактный абзац перехвата и два полученных аспекта и применил их оба по статическому методу. Затем я использовал команду ILMerge (последняя ILMerge), которую вы предоставили в результате EXE. И исходный EXE, и результат слияния выполняются без проблем и проходят проверку на паузу. Вы видите какую-то разницу? Можете ли вы соответствующим образом обновить описание? Благодаря! –

+0

Я использую 4.0.42 через пакет PostSharp Nuget. Я буду исследовать минимальное воспроизведение, а также обновить до более новой версии. –

+0

Я создал минимальный тестовый проект с 4.1.15, и он отлично работал, как и Daniel Balas. Я попытаюсь выяснить, как воспроизвести проблему с минимальным примером. –

ответ

0

Как было предложено @stakx, я пошел с альтернативой ILMerge. Теперь он отлично работает с LibZ.