我有一个生成.resx
资源文件的程序。那些资源文件被用于其他项目,这些项目不在与生成资源文件的项目相同的解决方案中。
现在我想知道是否可能从资源文件中生成designer.cs
文件,这样你可以直接访问资源而无需使用resxresourcereader。
我有一个生成.resx
资源文件的程序。那些资源文件被用于其他项目,这些项目不在与生成资源文件的项目相同的解决方案中。
现在我想知道是否可能从资源文件中生成designer.cs
文件,这样你可以直接访问资源而无需使用resxresourcereader。
打开 resx 文件,在其工具栏上有一个 Access Modifier
菜单。将其设置为 Public
。这将生成一个 *.Designer.cs
文件。
右键单击 Resources.resx
并选择“运行自定义工具”。
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";
}
我已经将上面的代码稍微压缩了一下,因为在我的实际解决方案中,我使用了一个自定义类来代替简单的文件名,以便支持不同子文件夹中相同的文件名(通过使用部分文件夹结构来生成命名空间)。但是对于第一次尝试,上面的代码应该会帮助您。
您也可以通过代码实现此操作:(摘自这里: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中,那么这就是如何重新生成文件。
转到访问修饰符并将其从(Public/Internal)更改为“无代码生成”
现在将其放回Public/Internal。VS会为您重新生成设计师文件。
这对我也有用:双击打开resx文件,添加一个虚拟资源,保存即可。.designer.cs文件将被生成。
Resources.resx
,不需要虚拟资源。 - Micha Wiedenmann