Создание сборки ресурсов с помощью AssemblyBuilder
Сценарий: я хочу создать сборки спутников, которые являются сборками ресурсов. Эта сборка содержит только компилированные ресурсы (ResourceWriter). Цель состоит в том, чтобы создавать сборки ресурсов вне VS и добавлять их в приложение, а это в моем приложении С#
Atm Я использую AssemblyBuilder для создания сборки. Он работает, но нет информации о сборке. Никакой культуры, ключа или чего-либо еще. Сборка не выполняется приложением с Исключением ресурсов Missing Manfifest.: (
Если возможно, я хочу остаться с AssemblyBuilder или с помощью CodeDomProvider.
Вопрос. Что необходимо для добавления новой сборки сателлитов в мое приложение? Достаточно ли иметь папку с культурой (en-US) и сборку с ресурсами в США?
Question2: Можно ли предоставить некоторую метаинформацию, такую как Version, Culture, в сборку?
Question3: достаточно ли для добавления ресурсов в сборку?
Код:
AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(
assemblyName, AssemblyBuilderAccess.RunAndSave, resourceFolder);
builder.AddResourceFile(name, assemblyFileName);
builder.Save(assemblyName.Name);
Для любой помощи я был бы благодарен.
Спасибо заранее
Ответы
Ответ 1
Нашел решение.
Источник: http://www.dotnet247.com/247reference/msgs/58/290731.aspx
Объяснение: Сначала Кажется, AssemblyBuilder связывает ресурс с сборкой, а не встраивается. Во-вторых, ресурс должен находиться в модуле, который будет отображаться основной сборкой. (Мне не нравится разбивать ресурс в модуле, но, похоже, нет возможности внедрить уже существующий ресурс)
код:
string myAsmName = "WriteSatelliteAssembly.resources";
string myAsmFileName = myAsmName + ".dll";
string resourceName = "WriteSatelliteAssembly.MyResource2.fr.resources";
string path;
path = AppDomain.CurrentDomain.BaseDirectory + "fr-FR";
AppDomain appDomain = Thread.GetDomain();
AssemblyName asmName = new AssemblyName();
asmName.Name = myAsmName;
asmName.CodeBase = path;
asmName.CultureInfo = new CultureInfo("fr");
AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave, path);
**ModuleBuilder** myModuleBuilder =
myAsmBuilder.DefineDynamicModule(myAsmFileName,
myAsmFileName);
**IResourceWriter** rw =
myModuleBuilder.DefineResource(resourceName,
"My Description",ResourceAttributes.Public);
rw.AddResource("resName","My (dynamic) resource value.");
rw.AddResource("resName2","My (dynamic) second resource value.");
myAsmBuilder.Save(myAsmFileName);
Доказательство:
Связанный ресурс в сборке
.file nometadata 'TestProjectResourceManager.Properties.Resources.en-US.resources'
.hash = (57 DD 82 37 9E B3 BA 8A 27 D0 69 90 37 67 22 23 // W..7....'.i.7g"#
A0 1C F7 47 ) // ...G
.mresource public TestProjectResourceManager.Properties.Resources
{
.file 'TestProjectResourceManager.Properties.Resources.en-US.resources' at 0x00000000
}
встроенный ресурс в сборке
.mresource public 'TestProjectResourceManager.Properties.Resources.en-US.resources'
{
// Offset: 0x00000000 Length: 0x000000EE
}
.module TestProjectResourceManager_2.resources.dll
Повеселись
Ответ 2
Для создания сборок вам понадобятся следующие инструменты.
- Resgen.exe
- al.exe
- ildasm.exe
al.exe - это программа, которая внедряет ресурсы в сборку спутников. Но al.exe будет принимать ресурсы только в двоичном формате .resources. Но наши входы обычно представляют собой файлы текстового ресурса или файлы ресурсов на основе XML в формате .resx. resgen.exe используется для преобразования этих альтернативных форм ресурсов в двоичный формат .resources, приемлемый для al.exe.
ildasm.exe: Если вы помните, что делает Visual Studio IDE, вы увидите, что между структурой каталогов файлов ресурсов и преобразованием этого ресурсного файла внутри сборки существует трансляция имени. Becaue мы используем IDE Visual Studio, чтобы генерировать ресурсы по умолчанию и процесс extenal для создания спутниковых сборок, оба механизма должны создавать сборки с одинаковой иерархией именования для файлов ресурсов.
Итак, мы используем ildasm для изучения DLL, которые Visual Studio IDE генерирует, чтобы узнать, что такое структура, и использовать тот же механизм для создания сборочных сборок. Вы также можете изучить спутниковые сборки, используя ildasm, чтобы убедиться, что вы правильно назвали имена. Это будет полезно для отладки ошибок диспетчера ресурсов, говорящих вам, что он не может найти ресурс.
Теперь, когда инструменты изложены, как мы преобразуем внешний файл ресурсов в сборку спутников? Как отмечено ниже, это три (действительно, два) этапа.
Шаг 0: укажите пути для resgen и al.exe:
@set path=%path%;
"C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin";
c:\winnt\microsoft.NET\framework\v1.0.3705
Шаг 1: Используйте resgen для создания файла .resources из файла .resx.
Resgen MyText.resx
Вышеупомянутая команда создаст файл с именем:
MyText.resources
Шаг 2: Используйте al.exe для создания сборки спутника:
Al.exe
/t:lib
/embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources
/culture:hi-gb
/out:MyApplication.resources.dll
Здесь стоит отметить пару вещей:
/t:lib: Says you are interested in a .dll.
/embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources : Embeds and renames the resource to a target name to match the Visual Studio IDE naming structure.
/culture:hi-gb : Identifies the culture in which you are interested.
/out:MyApplication.resources.dll : Name of the DLL in which you are interested.
Сгенерированный .dll должен иметь это соглашение об именах для .NET, чтобы найти его. Также обратите внимание, что вы должны указать настройку культуры, даже если культура доступна в имени файлов ресурсов. Поэтому он должен упоминаться в обоих местах.
Поместите сателлитовую сборку в соответствующий каталог
После создания спутниковой сборки физически скопируйте файл .dll в следующий каталог:
\MyApplication\bin\en-gb\MyApplication.Resources.DLL
В случае нескольких файлов ресурсов:
\MyApplication\resources\files\CommonResources.resx
\MyApplication\resources\files\Module1Resources.resx
\MyApplication\resources\files\Module2Resources.resx
И вы можете определить ключи для этих ресурсов в отдельной иерархии, как показано ниже:
\MyApplication\resources\keys\CommonKeys.cs
\MyApplication\resources\keysModule1Keys.cs
\MyApplication\resources\keys\Module2Keys.cs
Для пакетной программы script, пожалуйста, обратитесь к моему блогу
http://samithenerd.blogspot.com/2011/12/batch-program-for-creating-satellite.html