.resx
リソースファイルを生成するプログラムを入手しました。これらのリソースファイルは、リソースファイルを生成するプロジェクトと同じソリューションではない他のプロジェクトで使用されます。
ここで、リソースファイルからdesigner.cs
ファイルを生成して、resxresourcereaderを使用せずにリソースに直接アクセスできるかどうか疑問に思います。
Resxファイルを開くと、そのツールバーにAccess Modifier
メニューがあります。これをPublic
に設定します。これにより、*.Designer.cs
ファイルが生成されます。
ファイルをVisualStudioプロジェクトに追加する場合は、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";
}
上記のコードを少しフラットにしました。実際のソリューションでは、単純なファイル名の代わりに各画像にカスタムクラスを使用して、異なるサブフォルダーで同じファイル名をサポートしています(名前空間のフォルダー構造の一部を使用することにより)世代)。しかし、最初のショットでは、上記が役立つはずです。
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を参照する必要があります
これも私にとってはうまくいきました。resxファイルをダブルクリックして開き、ダミーリソースを追加して、[保存]をクリックします。 .designer.csファイルが生成されます。
不要だと思ったために削除したり、.gitignoreに追加したりした場合。これは、ファイルを再生成する方法です。
アクセス修飾子に移動し、(パブリック/内部)から「コード生成なし」に変更します
次に、パブリック/内部に戻します。 VSはDesignerファイルを再生成します。