从ResXRersourcewriter生成的资源文件中创建designer.cs文件

35

我有一个生成.resx资源文件的程序。那些资源文件被用于其他项目,这些项目不在与生成资源文件的项目相同的解决方案中。

现在我想知道是否可能从资源文件中生成designer.cs文件,这样你可以直接访问资源而无需使用resxresourcereader。

6个回答

78

打开 resx 文件,在其工具栏上有一个 Access Modifier 菜单。将其设置为 Public。这将生成一个 *.Designer.cs 文件。

输入图像描述


4
有时候在重命名 resx 文件时,项目文件或 TFS 会变得混乱。只需删除 .cs 文件并重新创建它,就可以完美地解决这个问题。 - MartijnK
3
将访问修饰符设置为public完美地起作用了 - 谢谢。 - Mani5556
只需保存Resources.resx文件,无需更改访问修饰符。 - Micha Wiedenmann
在 VS 2017 中将属性“Custom Tool”设置为值“PublicResXFileCodeGenerator”。 - Ondra Starenko

11

右键单击 Resources.resx 并选择“运行自定义工具”。


1
右键单击resx文件并选择属性。将值“PublicResXFileCodeGenerator”添加到“Custom Tool”属性中,然后设计师文件将被生成。 - AH.
2
在构建过程中有没有一种方法可以做到这一点? - AtosNicoS

7
如果文件添加到Visual Studio项目中,则必须将.resx文件的Custom Tool属性设置为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";
}

我已经将上面的代码稍微压缩了一下,因为在我的实际解决方案中,我使用了一个自定义类来代替简单的文件名,以便支持不同子文件夹中相同的文件名(通过使用部分文件夹结构来生成命名空间)。但是对于第一次尝试,上面的代码应该会帮助您。


3

您也可以通过代码实现此操作:(摘自这里: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



0

如果您因为认为不需要它而将其删除或添加到.gitignore中,那么这就是如何重新生成文件。

转到访问修饰符并将其从(Public/Internal)更改为“无代码生成”

现在将其放回Public/Internal。VS会为您重新生成设计师文件。


1
只需保存“Resources.resx”,无需更改“访问修饰符”。 - Micha Wiedenmann

0

这对我也有用:双击打开resx文件,添加一个虚拟资源,保存即可。.designer.cs文件将被生成。


只需保存 Resources.resx,不需要虚拟资源。 - Micha Wiedenmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接