我得到了一个生成.resx
资源文件的程序。这些资源文件在其他项目中使用,与生成资源文件的项目不在同一解决方案中。从ResXRersourcewriter生成的资源文件中创建designer.cs文件
现在我想知道是否可以从资源文件生成designer.cs
文件,以便您可以直接访问资源而不使用resxresourcereader。
我得到了一个生成.resx
资源文件的程序。这些资源文件在其他项目中使用,与生成资源文件的项目不在同一解决方案中。从ResXRersourcewriter生成的资源文件中创建designer.cs文件
现在我想知道是否可以从资源文件生成designer.cs
文件,以便您可以直接访问资源而不使用resxresourcereader。
打开resx文件,在它的工具栏上有一个Access Modifier
菜单。设置为Public
。这将生成一个*.Designer.cs
文件。
如果文件被添加到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";
}
我已经夷为平地,我真正的解决方案上面的代码一点点,因为我使用自定义类的每个画面,而不是简单的文件名还可以在不同的子文件夹中支持相同的文件名(通过使用命名空间生成的部分文件夹结构)。但对于第一枪,上述应该可以帮到你。
这也适用于我:双击并打开resx文件,添加一个虚拟资源,点击保存。生成.designer.cs文件。
保存“Resources.resx”就足够了,不需要虚拟资源。 –
你也可以这样做代码: (从这里摘自: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因为你认为你不需要它。这是如何重新生成文件。
转到访问修饰符和它(公共/内部),以“无代码生成”
改变现在把它放回公共/内部。 VS将为您重新生成Designer文件。
保存'Resources.resx'就足够了,不需要改变'Access modifier'。 –
右键单击Resources.resx
并选择“运行自定义工具”。
这应该是正确的答案! –
当人们重命名resx时,项目文件/ TFS有时会感到困惑。只需删除.cs文件并使用此功能重新创建它就像魅力一样。 – MartijnK
设置Access公共访问修饰符完美无缺 - 谢谢。 – Mani5556
保存Resources.resx就足够了,不需要更改Access修饰符。 –