Создайте файл designer.cs из файла ресурсов, созданного ResXRersourcewriter
Я получил программу, которая генерирует .resx
файлы ресурсов. Эти файлы ресурсов используются в других проектах, что не является тем же решением, что и проект, который генерирует файлы ресурсов.
Интересно, если это возможно, чтобы генерировать designer.cs
файл из файла ресурсов, так что вы можете получить доступ к ресурсам напрямую, без использования resxresourcereader.
6 ответов
Откройте файл Resx и на его панели инструментов есть Access Modifier
меню. Установите это в Public
, Это создаст *.Designer.cs
файл.
Щелкните правой кнопкой мыши на Resources.resx
и выберите "Запустить пользовательский инструмент".
Если файл добавлен в проект Visual Studio, вы должны установить Custom Tool
собственность .resx
подать в ResXFileCodeGenerator
, Затем VS автоматически создаст нужный файл конструктора.
В одном проекте я создал скрипт T4, который сканирует папку в проекте для всех изображений и позволяет одним щелчком создать соответствующий файл ресурсов.
Вот необходимая часть из сценария T4:
var rootPath = Path.GetDirectoryName(this.Host.TemplateFile);
var imagesPath = Path.Combine(rootPath, "Images");
var resourcesPath = Path.Combine(rootPath, "Resources");
var pictures = Directory.GetFiles(imagesPath, "*.png", SearchOption.AllDirectories);
EnvDTE.DTE dte = (EnvDTE.DTE)((IServiceProvider)this.Host)
.GetService(typeof(EnvDTE.DTE));
EnvDTE.Projects projects = dte.Solution.Projects;
EnvDTE.Project iconProject = projects.Cast<EnvDTE.Project>().Where(p => p.Name == "Icons").Single();
EnvDTE.ProjectItem resourcesFolder = iconProject.ProjectItems.Cast<EnvDTE.ProjectItem>().Where(item => item.Name == "Resources").Single();
// Delete all existing resource files to avoid any conflicts.
foreach (var item in resourcesFolder.ProjectItems.Cast<EnvDTE.ProjectItem>())
{
item.Delete();
}
// Create the needed .resx file fore each picture.
foreach (var picture in pictures)
{
var resourceFilename = Path.GetFileNameWithoutExtension(picture) + ".resx";
var resourceFilePath = Path.Combine(resourcesPath, resourceFilename);
using (var writer = new ResXResourceWriter(resourceFilePath))
{
foreach (var picture in picturesByBitmapCollection)
{
writer.AddResource(picture.PictureName, new ResXFileRef(picture, typeof(Bitmap).AssemblyQualifiedName));
}
}
}
// Add the .resx file to the project and set the CustomTool property.
foreach (var resourceFile in Directory.GetFiles(resourcesPath, "*.resx"))
{
var createdItem = resourcesFolder.Collection.AddFromFile(resourceFile);
var allProperties = createdItem.Properties.Cast<EnvDTE.Property>().ToList();
createdItem.Properties.Item("CustomTool").Value = "ResXFileCodeGenerator";
}
Я немного упростил приведенный выше код, потому что в моем реальном решении я использую собственный класс для каждого изображения вместо простого имени файла, чтобы также поддерживать одно и то же имя файла в разных подпапках (используя часть структуры папок для пространства имен поколения). Но для первого выстрела вышеупомянутое должно помочь вам.
Вы также можете сделать это в коде: (взято отсюда: msdn)
StreamWriter sw = new StreamWriter(@".\DemoResources.cs");
string[] errors = null;
CSharpCodeProvider provider = new CSharpCodeProvider();
CodeCompileUnit code = StronglyTypedResourceBuilder.Create("Demo.resx", "DemoResources",
"DemoApp", provider,
false, out errors);
if (errors.Length > 0)
foreach (var error in errors)
Console.WriteLine(error);
provider.GenerateCodeFromCompileUnit(code, sw, new CodeGeneratorOptions());
sw.Close();
Вам нужно сослаться на system.design.dll
Если вы удалили его или добавили в.gitignore, потому что думали, что вам это не нужно. это как вы регенерируете файл.
Перейдите к модификатору Access и измените его с (Public/Internal) на "No Generation"
Теперь верните его в Public/Internal. VS восстановит файл Designer для вас.
Это также сработало для меня: дважды щелкните и откройте файл resx, добавьте фиктивный ресурс, нажмите Сохранить. файл.designer.cs создан.