Создайте файл designer.cs из файла ресурсов ResXRersourcewriter

У меня есть программа, которая генерирует файлы ресурсов .resx. Эти файлы ресурсов используются в других проектах, которые не находятся в том же решении, что и проект, который генерирует файлы ресурсов.

Интересно, может ли он сгенерировать файл designer.cs из файла ресурсов, чтобы вы могли напрямую обращаться к ресурсам без использования resxresourcereader.

Ответ 1

Откройте файл resx и на его панели инструментов появится меню Access Modifier. Установите это в Public. Это *.Designer.cs файл *.Designer.cs.

enter image description here

Ответ 2

Если файл добавлен в проект Visual Studio, вы должны установить свойство Custom Tool файла .resx на ResXFileCodeGenerator. Затем VS автоматически создаст необходимый файл конструктора.

В одном проекте я создал T4 script, который сканирует папку в проекте для всех изображений и позволяет создать соответствующий файл ressource одним щелчком.

Вот необходимая часть из T4 script:

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";
}

Я немного сгладил приведенный выше код, потому что в моем реальном решении я использую собственный класс для каждого изображения вместо простого имени файла, чтобы также поддерживать одно и то же имя файла в разных подпапках (используя часть структуры папок для генерации пространства имен). Но для первого выстрела это должно помочь вам.

Ответ 3

Щелкните правой кнопкой мыши на Resources.resx и выберите "Запустить пользовательский инструмент".

Ответ 4

Вы также можете сделать это в коде: (Взято отсюда: 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

Ответ 5

Это также сработало для меня: дважды щелкните и откройте файл resx, добавьте фиктивный ресурс, нажмите "Сохранить". создается файл .designer.cs.

Ответ 6

Если вы удалили его или добавили в .gitignore, потому что считали, что вам это не нужно. это то, как вы регенерируете файл.

Перейдите к модификатору доступа и измените его с (Public/Internal) на "No Code Generation"

Теперь верните его в Public/Internal. VS будет регенерировать файл Designer для вас.