C# 从resxresourcewriter生成的资源文件创建designer.cs文件

C# 从resxresourcewriter生成的资源文件创建designer.cs文件,c#,visual-studio,resx,C#,Visual Studio,Resx,我有一个生成.resx资源文件的程序。这些资源文件用于其他项目,这些项目与生成资源文件的项目不在同一解决方案中 现在,我想知道是否可以从资源文件生成designer.cs文件,这样您就可以直接访问资源,而无需使用resxresourcereader。打开resx文件,其工具栏上有一个访问修饰符菜单。将此设置为Public。这将生成一个*.Designer.cs文件 如果将文件添加到Visual Studio项目中,则必须将.resx文件的自定义工具属性设置为ResXFileCodeGenerat

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


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

打开resx文件,其工具栏上有一个
访问修饰符
菜单。将此设置为
Public
。这将生成一个
*.Designer.cs
文件


如果将文件添加到Visual Studio项目中,则必须将
.resx
文件的
自定义工具
属性设置为
ResXFileCodeGenerator
。然后VS将自动创建所需的设计器文件

在一个项目中,我制作了一个T4脚本,该脚本扫描项目中的文件夹中的所有图像,并允许单击创建相应的ressource文件

以下是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";
}
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=dte.Solution.Projects;
EnvDTE.Project iconProject=projects.Cast()。其中(p=>p.Name==“Icons”).Single();
EnvDTE.ProjectItem resourcesFolder=iconProject.ProjectItems.Cast()。其中(item=>item.Name==“Resources”).Single();
//删除所有现有资源文件以避免任何冲突。
foreach(resourcesFolder.ProjectItems.Cast()中的变量项)
{
项目.删除();
}
//为每张图片创建所需的.resx文件。
foreach(图片中的var图片)
{
var resourceFilename=Path.GetFileNameWithoutExtension(图片)+“.resx”;
var resourceFilePath=Path.Combine(resourcesPath,resourceFilename);
使用(var writer=new ResXResourceWriter(resourceFilePath))
{
foreach(PicturesByMapCollection中的var图片)
{
writer.AddResource(picture.PictureName,新的ResXFileRef(picture,typeof(Bitmap.AssemblyQualifiedName));
}
}
}
//将.resx文件添加到项目中并设置CustomTool属性。
foreach(目录.GetFiles(resourcesPath,*.resx)中的var resourceFile)
{
var createdItem=resourcesFolder.Collection.AddFromFile(resourceFile);
var allProperties=createdItem.Properties.Cast().ToList();
createdItem.Properties.Item(“CustomTool”).Value=“ResXFileCodeGenerator”;
}

我将上面的代码展平了一点,因为在我的实际解决方案中,我对每张图片使用自定义类,而不是简单的文件名,以便在不同的子文件夹中也支持相同的文件名(通过使用文件夹结构的一部分生成名称空间)。但是对于第一次尝试,上面的内容应该会对您有所帮助。

这对我也很有用:双击并打开resx文件,添加一个虚拟资源,然后单击保存。此时将生成.designer.cs文件。

您也可以在代码中执行此操作: (摘自此处:)


如果删除system.design.dll或将其添加到.gitignore,因为您认为不需要它,则需要引用它。这就是重新生成文件的方式

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

现在把它放回公共/内部。
VS将为您重新生成设计器文件。

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

当人们重命名resx时,项目文件/TFS有时会混淆。只需删除.cs文件并使用此功能重新创建它就可以了。将访问修饰符设置为Public工作得非常完美-谢谢。保存Resources.resx就足够了,无需更改访问修饰符。在VS 2017中,将属性“Custom Tool”设置为值“PublicResXFileCodeGenerator”,保存
资源。resx
就足够了,无需更改
访问修饰符
。保存
资源。resx
就足够了,不需要虚拟资源。右键单击resx文件并选择属性。将值“PublicResXFileCodeGenerator”添加到“Custom Tool”属性,然后将生成设计器文件。
 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();