Встраивание значков в приложение 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, и ни одна из его встроенных функций для создания ресурсов не создавала необработанные ресурсы. Из-за этого ваш выбор:
- создать .res файл "вручную", как описано в связанной статье, или
- добавьте задачу сборки, чтобы вы могли вызвать компилятор ресурсов 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. Чтобы сделать это легко, вы можете добавить дополнительную задачу сборки и цель. Вот как:
- построить проект, содержащий одну задачу сборки" Win32ResourceCompiler " и скомпилировать его
- создать .целевой файл, содержащий один цель, которая использует эту задачу для автоматической сборки .rc-файл в a .res
- установите проект для использования полученного результата .файл 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 ).