Как встроить ресурс в исполняемый файл .NET PE? - PullRequest
5 голосов
/ 09 ноября 2011

Как я могу включить ресурс в .NET PE (Portable Executable) в Visual Studio 2010?

В старины мы создавали файл сценария ресурса:

wumpa.rc :

* * 1010

Добавьте этот файл в проект, и компилятор скомпилирует файл .rc; включая ресурсы в окончательный исполняемый образ.

Что такое управляемый механизм / .NET / Visual Studio для включения ресурсов?

Смотри также


Это должны быть стандартные ресурсы; Вы знаете, что каждый может читать как ресурсы:

  • Хакер ресурсов будет отображаться как ресурсы
  • PEView будет отображаться как ресурсы
  • Internet Explorer может читать с использованием протокола res (например, res://c:\foo\MyProgram.exe/PNG/SplashLogo)

То, что я пробовал, не работает:

  1. Добавление ресурсов в файл Resources.resx:

    enter image description here

  2. Добавление ресурсов в файл Resources.resx и указание действия по сборке Resource :

    enter image description here

    (также пытался выполнить действия по сборке: Embedded Resource , как мне было предложено в 2008 )


Обновление: Что не сработало

Я попытался добавить файл (wumpa.rc) в проект:

wumpa.rc

SplashPNG   PNG   "Splash.png"

По умолчанию это не сработало. я попытался изменить Build Action из wumpa.rc:

  • Содержимое (по умолчанию): не работает
  • Компиляция : " Пространство имен не может напрямую содержать элементы, такие как поля или методы "
  • Встроенный ресурс : не работает
  • Ресурс : не работал

Что я получаю (ничего):

enter image description here

Что я ожидаю (что-то):

enter image description here

И затем, когда вы указываете Internet Explorer на ресурс (используя протокол res):

res://C:\Develop\Avatar\LocaleInfo\LocaleInfo.exe\PNG\SplashPNG

IE может найти его:

enter image description here

Ответы [ 2 ]

5 голосов
/ 09 ноября 2011

Управляемые ресурсы встраиваются в сборки не так, как ресурсы Win32 - опция «Встроенный ресурс» будет встраивать ваш ресурс в выходную сборку, но не так, как это доступно с помощью таких вещей, какПротокол "res".

Вы можете использовать инструмент для встраивания Win32 в существующий ресурс, как описано здесь: Встраивание ресурсов Win32 в программы на C # (CodeProject) .

В качестве альтернативы вы можете использовать опцию компилятора /win32res csc.exe для встраивания скомпилированного ресурса .res.Этот параметр в настоящее время не предоставляется в качестве опции в Visual Studio 2010, однако здесь есть ряд инструкций здесь , в которых объясняется, как это можно сделать.Вам просто нужно скомпилировать ресурс как обычно, используя rc.exe (например, как шаг перед сборкой):

<Target Name="BeforeBuild" Inputs="my_resource_file.rc" Outputs="my_resource_file.res">
    <Exec Command="&quot;C:\Program Files\Microsoft Visual Studio 8\VC\bin\rc.exe&quot; /r my_resource_file.rc" />
</Target>

И затем предоставить свойство Win32Resource для указания выходного файла .res:

<Win32Resource>my_resource_file.res</Win32Resource>

Обновление: В качестве альтернативы вы можете использовать задачу RC MSBuild , если вы не против редактировать MSBuild файл .csproj.Простой пример:

<UsingTask TaskName="RC" AssemblyName="Microsoft.Build.CppTasks.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<PropertyGroup>
    <Win32Resource Condition="'$(Win32Resource)' != ''">@(ResourceCompile->'%(RelativeDir)%(filename).res')</Win32Resource>
</PropertyGroup>
<ItemGroup>
    <ResourceCompile Include="test.rc" />
</ItemGroup>
<Target Name="ResourceCompile" BeforeTargets="BeforeCompile" Condition="'@(ResourceCompile)' != ''">
    <RC Source="@(ResourceCompile)" />
</Target>

Это будет работать, только если установлен Visual C ++.

1 голос
/ 28 января 2012

Вот альтернативное событие предварительной сборки для Visual Studio 2010, которое в меньшей степени зависит от конкретных расположений каталогов:

@echo.
set RCDIR=
IF EXIST "$(FrameworkSDKDir)Bin\rc.exe" (set RCDIR="$(FrameworkSDKDir)Bin\rc.exe")
IF EXIST "$(DevEnvDir)..\..\VC\Bin\rc.exe" (set RCDIR="$(DevEnvDir)..\..\VC\Bin\rc.exe")
IF EXIST "$(DevEnvDir)..\..\SDK\v2.0\Bin\rc.exe" (set RCDIR="$(DevEnvDir)..\..\SDK\v2.0\Bin\rc.exe")
IF EXIST "$(DevEnvDir)..\..\SDK\v3.5\Bin\rc.exe" (set RCDIR="$(DevEnvDir)..\..\SDK\v3.5\Bin\rc.exe")
IF EXIST "$(DevEnvDir)..\..\..\Microsoft SDKs\Windows\v6.0a\bin\rc.exe" (set RCDIR="$(DevEnvDir)..\..\..\Microsoft SDKs\Windows\v6.0a\bin\rc.exe")
IF EXIST "$(DevEnvDir)..\..\..\Microsoft SDKs\Windows\v7.0a\bin\rc.exe" (set RCDIR="$(DevEnvDir)..\..\..\Microsoft SDKs\Windows\v7.0a\bin\rc.exe")
if not defined RCDIR (echo "Error!  Unable to find rc.exe.") ELSE (%RCDIR% /r "$(ProjectDir)MyResources.rc")
if not defined RCDIR (Exit 1)
@echo.

Конечно, измените MyResources.rc на соответствующее имя файла.

Если вы используете это событие перед сборкой, вы можете указать Visual Studio использовать соответствующий файл .RES в диалоговом окне «Свойства проекта» в разделе «Приложение»> «Ресурсы» (для C #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...