WPF .exe — большой размер файла

Я работаю над приложением WPF, и размер файла .exe превышает 1,2 МБ. Я хотел бы уменьшить размер конечного исполняемого файла. Код занимает не больше нескольких 200 Кб, в проекте я использую несколько картинок в формате .png, что в сумме занимает около 20 Кб. Почему окончательный исполняемый файл такой большой? Я использовал статистику ILDASM, чтобы посмотреть статистику .exe. Публикация вывода ниже:

File size            : 1267712
 PE header size       : 512 (496 used)    ( 0.04%)
 PE additional info   : 1547              ( 0.12%)
 Num.of PE sections   : 3
 CLR header size     : 72                 ( 0.01%)
 CLR meta-data size  : 72524              ( 5.72%)
 CLR additional info : 1160002            (91.50%)
 CLR method headers  : 3189               ( 0.25%)
 Managed code         : 28702             ( 2.26%)
 Data                 : 2048              ( 0.16%)
 Unaccounted          : -884              (-0.07%)

 Num.of PE sections   : 3
   .text    - 1265152
   .rsrc    - 1536
   .reloc   - 512

 CLR meta-data size  : 72524
   Module        -    1 (10 bytes)
   TypeDef       -   58 (812 bytes)     0 interfaces, 0 explicit layout
   TypeRef       -  250 (1500 bytes)
   MethodDef     -  647 (9058 bytes)    0 abstract, 0 native, 639 bodies
   FieldDef      -  216 (1296 bytes)    10 constant
   MemberRef     -  481 (2886 bytes)
   ParamDef      -  460 (2760 bytes)
   MethodImpl    -   11 (66 bytes)
   Constant      -   11 (66 bytes)
   CustomAttribute-  506 (3036 bytes)
   StandAloneSig -   73 (146 bytes)
   InterfaceImpl -   27 (108 bytes)
   PropertyMap   -   29 (116 bytes)
   Property      -  233 (1398 bytes)
   MethodSemantic-  304 (1824 bytes)
   TypeSpec      -   30 (60 bytes)
   Assembly      -    1 (22 bytes)
   AssemblyRef   -   13 (260 bytes)
   ManifestResource-    2 (24 bytes)
   NestedClass   -   17 (68 bytes)
   EventMap      -    5 (20 bytes)
   Event         -    7 (42 bytes)
   MethodSpec    -   12 (48 bytes)
   Strings       - 21669 bytes
   Blobs         - 18740 bytes
   UserStrings   -  6244 bytes
   Guids         -    16 bytes
   Uncategorized -   229 bytes

 CLR additional info : 1160002
   Resources         - 1160002

 CLR method headers : 3189
   Num.of method bodies  - 639
   Num.of fat headers    - 169
   Num.of tiny headers   - 470
   Num.of fat sections   - 3
   Num.of small sections - 25

 Managed code : 28702
   Ave method size - 44

Как видите, дополнительная информация CLR занимает большую часть места. Я использую все визуальные стили в своем проекте как StaticResource, что, я думаю, не имеет большого значения? Как можно объяснить большой размер .exe? (Сборка проекта в режиме релиза x64)

ОБНОВЛЕНИЕ:

Мои варианты сборки:

Configuration - Release
Platform - x64
Optimize code - enabled
Allow unsafe code - disabled
Conditional comppilation symbols - none

person jester    schedule 06.01.2014    source источник
comment
Меня больше интересует попытка понять, что способствует дополнительной информации CLR ... :) Я могу жить с 1,2 МБ exe;)   -  person jester    schedule 06.01.2014
comment
Пожалуйста, покажите параметры компилятора/сборки. Кстати, пробел также является «кодом», поэтому количество кода не является лучшим показателем размера вывода. Но здесь определенно что-то не так, у меня гораздо большие кодовые базы, дающие гораздо меньшие сборки.   -  person stijn    schedule 06.01.2014
comment
@stijn обновил вопрос с параметрами сборки   -  person jester    schedule 06.01.2014
comment
да извините понятия не имею. Только что проверил, и у меня также есть проекты с большим количеством статических ресурсов, но нигде у меня нет такой большой сборки. Я также проверил пару сторонних dll, и хотя некоторые из них намного больше, чем ваша, ни одна из них не имеет такого большого размера «дополнительной информации». Я бы попробовал удалить некоторые ресурсы/код и посмотреть, уменьшится ли размер.   -  person stijn    schedule 06.01.2014
comment
Какова ваша целевая структура? Вы используете .NET Full framework или клиентский профиль .NET? Изменение фреймворка на профиль клиента может уменьшить размер. Дополнительные сведения: blogs.msdn.com/b/jgoldb/archive/2010/04/12/   -  person carleson    schedule 06.01.2014
comment
@carleson Я нацелен на профиль клиента .NET 4.0   -  person jester    schedule 07.01.2014
comment
Чтобы добавить к тому, что @stijn упомянул, VS по умолчанию добавляет изображения в качестве ресурсов вместо контента. Это приводит к их внедрению в исполняемый файл. Вместо этого попробуйте установить для них значение «Содержимое» и посмотрите, уменьшится ли размер вашего файла.   -  person B2K    schedule 08.01.2014
comment
Я бы использовал dotPeek (jetbrains.com/decompiler), чтобы увидеть структуру EXE. Наверняка вы сможете увидеть преступника там.   -  person Pablo Montilla    schedule 08.01.2014


Ответы (2)


Стили по умолчанию, на которые косвенно ссылаются, со всеми зависимостями, которые у них есть, обычно не отображаются в коде или XAML. Я не уверен, но если WPF встраивает их в exe, это может объяснить некоторые накладные расходы. Вы можете проверить это, удалив большую часть кода, зависящего от WPF, чтобы увидеть, существенно ли это влияет на размер файла.

Также могут быть накладные расходы из-за того, что WPF является исполняемым. Вы можете проверить это, поместив свой код в проект WPF Custom или User Control Library. Это может быть создано визуальной студией. Если для одного и того же содержимого результирующие библиотеки DLL намного меньше, чем EXE-файлы, это может быть сочетанием WPF и исполняемого файла.

В общем, я считаю, что накладные расходы на размер файла неудивительны. Как большой фреймворк, WPF не славится своей крошечностью и эффективностью.

Два комментария к ответу здесь: Почему мой .net exe такой огромный инструмент анализатора? также может быть полезен.

person user1182735    schedule 10.01.2014
comment
Первый комментарий дал мне ответ. Спасибо :) - person jester; 05.08.2014

Это, вероятно, проблема со встроенными ресурсами.

Если вы добавили изображения или другие ресурсы в проект, даже если вы удалите файл из проекта, ресурс останется встроенным.

Проверьте раздел «Ресурсы» в свойствах проекта.

Например, вы сначала добавили свои изображения в виде растровых изображений, а затем удалили файлы и добавили в формате png?

person Thejaka Maldeniya    schedule 08.01.2014