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

时间:2013-01-04 08:55:53

标签: c# visual-studio resx

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

我现在想知道,如果可以从资源文件生成designer.cs文件,那么您可以直接访问资源而无需使用resxresourcereader。

6 个答案:

答案 0 :(得分:37)

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

enter image description here

答案 1 :(得分:4)

如果文件已添加到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";
}

我已经将上面的代码弄平了一点,因为在我真正的解决方案中我使用每个图片的自定义类而不是简单的文件名也支持不同子文件夹中的相同文件名(通过使用文件夹结构的一部分)用于命名空间生成)。但是对于第一枪,上面应该对你有帮助。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您也可以在代码中执行此操作: (摘自: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

答案 4 :(得分:0)

这对我也有用:双击并打开resx文件,添加虚拟资源,单击“保存”。生成.designer.cs文件。

答案 5 :(得分:0)

如果您删除它或将其添加到.gitignore,因为您认为自己不需要它。这是重新生成文件的方法。

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

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