Встраивание значков в приложение WPF в качестве ресурса

Я пытаюсь встроить значок в мое приложение my WPF, чтобы я мог вытащить его для использования в качестве значка в Windows 7 JumpList, используя следующий код:

newScene.IconResourcePath = System.Reflection.Assembly.GetEntryAssembly().Location;
newScene.IconResourceIndex = 0;

Я заставил его работать, используя следующий метод:http://dennisdel.com/?p=38

однако, это не кажется лучшим подходом, и кажется, что должен быть более простой способ встроить ресурс значка в мое приложение, все еще оставляя "и Манифест опции" проверил в свойствах приложения для моей программы.

Я пробовал множество методов, включая установку действия сборки значков как ресурса и встроенного ресурса, но каждый раз, когда я открываю свой .exe в Редакторе ресурсов, значок не отображается.

какие предложения?

1 ответов


Visual Studio не поставляется с способом выполнения компилятора ресурсов Win32 из задачи MSBuild, и ни одна из его встроенных функций для создания ресурсов не создавала необработанные ресурсы. Из-за этого ваш выбор:

  1. создать .res файл "вручную", как описано в связанной статье, или
  2. добавьте задачу сборки, чтобы вы могли вызвать компилятор ресурсов Win32 из своего .csproj файл

сначала я объясню различия между пять различных видов "ресурсов", которые могут существовать в .exe или .dll-файл, включая "ресурсы Win32", которые требуются JumpList.

затем я объясню, как создать пользовательскую задачу сборки, которая позволяет вставлять произвольные ресурсы Win32 в C# или VB.NET исполняемый файл.


пять видов ресурсов в исполняемом файле Win32

существует пять различных видов "ресурсов", которые могут существовать в .exe или .файл DLL файл:

  • Ресурсами Win32
  • NET Framework "встроенные ресурсы"
  • объекты CLR в наборе ресурсов
  • ресурсы XAML
  • ресурсы WPF (объекты в ResourceDictionary)

Ресурсами Win32

исходный вид ресурса был Win32 "Resource". Этот вид ресурса определяется .rc-файл и имеет либо нумерованные, либо именованные ресурсы, каждый из которых имеет тип и blob данных. The
Компилятор ресурсов Win32, rc.exe, компилирует .rc-файл в двоичный файл .затем файл res можно добавить в результирующий исполняемый файл.

Win32 ресурсы доступны с помощью Win32 FindResource и LoadResource функции.

Win32 ресурсы внедряются в приложения C++ путем добавления их в .rc-файл, который компилируется в a .res файл и связан с исполняемым файлом. Они также могут быть добавлены после того, с помощью RC.исполняемый программа. Для C# и VB.NET приложения, MSBuild может добавить предварительно построенный .res-файл в исполняемый файл, который он создает с помощью компилятора Csc или VBC, или он может создать для вас файл по умолчанию. Ни C#, ни VB.NET имеет возможность строить не по умолчанию .res-файлы от .rc-файлы, и нет задачи MSBuild, чтобы сделать это за вас.

вы можете просмотреть ресурсы Win32 в a .exe или .dll, открыв .exe или .сам файл dll в Visual Studio с помощью File - > Open.

типичный C, C++ или Приложение MFC будет иметь много ресурсов Win32, например каждое диалоговое окно будет указано ресурсом.

типичное приложение WPF будет иметь только три ресурса Win32 по умолчанию, построенные C# или VB.NET компилятор: ресурс версии, RT_MANIFEST и значок приложения. Содержимое этих ресурсов строится из атрибутов сборки в коде и <ApplicationIcon> элемент .csproj или .файл vbproj файл.

это ресурс, который ищет JumpList.

Внедренные Ресурсы

"встроенный ресурс" - это ресурс NET Framework. Структура данных, содержащая эти ресурсы, управляется средой CLR способом, более благоприятным для доступа управляемого кода. Каждый ресурс идентифицируется строковым именем, которое по соглашению начинается с пространства имен класса, с которым связан ресурс.

встроенный ресурс - это просто двоичный объект данные с именем. Фактический тип данных известен вызывающему объекту или выводится из имени, аналогично файлам в файловой системе. Например, внедренный ресурс с именем, заканчивающимся на ".jpg", вероятно, будет файлом JPEG.

доступ к встроенным ресурсам осуществляется с помощью Assembly.GetManifestResourceStream и братьями GetManifestResourceInfo и GetManifestResourceNames.

встроенные ресурсы встроены .exe и .dll-файлы, добавив файл в проект и установив действие сборки в " Embedded Ресурс."

вы можете просмотреть встроенные ресурсы в a .exe или .dll, открыв его в NET Reflector и посмотрев на папку "ресурсы".

встроенные ресурсы обычно используются в WinForms, но почти никогда с WPF.

Наборы Ресурсов (.resx файл/.ресурсы)

несколько объектов NET Framework, таких как строки и значки, могут быть объединены в одну структуру данных "набор ресурсов", которая хранится в .exe как Единый встроенный ресурс NET Framework. Например, это используется WinForms для хранения таких вещей, как значки и строки, которые нелегко включить в сгенерированный код.

объекты в наборе ресурсов могут быть получены индивидуально с помощью ResourceManager и ResourceSet классы, определенные средой CLR.

объекты в наборе ресурсов определяются в исходном коде a .файл resx. Данные могут быть непосредственно в .resx-файл (как в случае со строками )или на который ссылается.файл resx (как в случае с иконами). При построении проекта содержимое указывается каждым .файлы resx сериализуются в двоичную форму и хранятся как единый встроенный ресурс с расширением".resx и" заменить ".ресурсы."

вы можете просмотреть объекты в наборе ресурсов, открыв его .exe или .dll в NET Reflector, открыв папку ресурсов, нажав на ".ресурсы " файл и просмотр элементов в правой панели.

многие функции WinForms-era обычно используемый.resx-файлы и ResourceSets аналогично старому Win32 .rc файлы, для хранения нескольких ресурсов, таких как строки все вместе. Они также используются самими WinForms для хранения параметров в форме, которая не может идти в коде позади.

приложения WPF почти никогда не используют произвольные объекты в ResourceSets, хотя сам WPF использует ResourceSets внутренне для хранения скомпилированного XAML.

ресурсы XAML

ресурс XAML WPF скомпилированный файл XAML, который хранится внутри набора ресурсов. Имя внутри набора ресурсов-это исходное имя файла с ".xaml " заменен на ".г.BAML-код". Содержимое может быть любым допустимым XAML, наиболее распространенными типами являются Window, Page, UserControl, ResourceDictionary и
Приложение.

ресурсы WPF могут быть загружены с помощью Application.LoadComponent() или путем ссылки на исходное имя файла XAML в контексте WPF. Кроме того, любой ресурс WPF, который имеет код позади (как указано x:Class) будет автоматически загружаться и применяться к каждому объекту, который создается из этого класса во время его InitializeComponent звонок.

ресурсы WPF создаются путем добавления a .xaml-файл для вашего проекта и установка его действия сборки в "ресурс", "страница"или " ApplicationDefinition". Это заставляет компилятор скомпилировать файл в BAML и добавить его в соответствующий ResourceSet.

вы можете просмотреть ресурсы XAML .exe или .dll, открыв его в NET Reflector с надстройкой BamlViewer установлен, выбрав сервис - > BAML Viewer из меню, и с помощью BAML Viewer, чтобы перейти к конкретному .г.файл BAML-код внутри .ресурсы.

ресурсы WPF в ResourceDictionary

в WPF почти все, что известно как" ресурсы", являются записями в ResourceDictionary. ResourceDictionaries описаны в XAML, либо в других объектах, таких как Windows и UserControls, либо в отдельных файлах XAML, содержащих только Объект ResourceDictionary. Каждый из них идентифицируется "x:Key", который может быть любым типом объекта. Сами ресурсы, также могут быть любого типа объекта.

на ресурсы WPF можно ссылаться в XAML с помощью {StaticResource} и {DynamicResource} расширения разметки или могут быть загружены в код с помощью FindResource.

ресурсы WPF добавляются в ResourceDictionary путем добавления их в файл XAML, содержащий ResourceDictionary внутри <ResourceDictionary> элемент и придает им x:Key атрибут.

ресурсы WPF широко используются в WPF, включая кисти, стили,данные, геометрию, шаблоны и т. д.

вы можете просмотреть ресурсы WPF в a .exe или .dll, просматривая ресурсы XAML, как описано выше, и для каждого из них просматривая теги ResourceDictionary, чтобы увидеть сами ресурсы.


включая ресурсы Win32 в C# или VB.NET исполняемый файл

как легко встроить произвольный Win32 Ресурсы в C# или VB.NET - ... exe

вы заметите из обсуждения выше, что легко добавить каждый тип ресурса к вашему C# или VB.NET применение за исключением для ресурсов Win32. Чтобы сделать это легко, вы можете добавить дополнительную задачу сборки и цель. Вот как:

  1. построить проект, содержащий одну задачу сборки" Win32ResourceCompiler " и скомпилировать его
  2. создать .целевой файл, содержащий один цель, которая использует эту задачу для автоматической сборки .rc-файл в a .res
  3. установите проект для использования полученного результата .файл res

задача предельно проста:

public class Win32ResourceCompiler : ToolTask
{
  public ITaskItem Source { get; set; }
  public ITaskItem Output { get; set; }

  protected override string ToolName { get { return "rc.exe"; } }

  protected override string GenerateCommandLineCommands()
  {
    return @"/r /fo """ + Output.ItemSpec + @""" """ + Source.ItemSpec + @"""";
  }

  protected override string GenerateFullPathToTool()
  {
    // TODO: Return path to rc.exe in your environment
  }
}

The .файл targets также очень прост. Будет что-то в этом роде:--22-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="SomeNamespace.Win32ResourceCompiler" AssemblyFile="Something.dll" />

  <PropertyGroup>
    <CoreCompileDependsOn>$(CoreCompileDependsOn);CompileWin32RCFile</CoreCompileDependsOn>
  </PropertyGroup>

  <Target Name="CompileWin32RCFile" Outputs="@(Win32RCFile->'%(filename).res')">
    <Win32ResourceCompiler
      Source="@(Win32RCFile)"
      Output="@(Win32RCFile->'%(filename).res')" />
  </Target>
</Project>

теперь в вашем .файл csproj, добавьте ссылку на ваш .файл целей:

<Import Project="Win32ResourceCompiler.targets" />

и, конечно, вам нужно дать свой .rc-файл тип файла Win32RCFile:

<ItemGroup>
  <Win32RCFile Include="MyWin32Resources.rc" />
</ItemGroup>

С помощью этой установки вы можете создать традиционный Win32 .rc-файл для указания всех ресурсов Win32, включая версию, манифест, значок приложения и столько дополнительных значков, сколько вы хотите. Каждый раз, когда вы компилируете, все эти ресурсы Win32 будут добавлены к вашему .файл EXE.

это займет немного времени, но гораздо сытнее и проще в долгосрочной перспективе, чем редактировать вручную .файл res.

вы можете указать несколько значков в вашем .rc-файл выглядит так:

1 ICON ApplicationIcon.ico
2 ICON JumpListIcon.ico
3 ICON AnotherIcon.ico

здесь - это документация для всех операторов определения ресурсов, которые можно использовать в a .rc файл.

Также обратите внимание, что выше .файл targets был набран под влиянием момента и не был протестирован. Документация по синтаксису MSBuild (.csproj и .целей) файлы можно найти здесь и здесь, и хорошие примеры .целевые файлы можно найти в каталог c:\windows\microsoft.net\framework\v3.5 ).