2013-01-04 14 views
9

Mam program, który generuje pliki zasobów .resx. Te pliki zasobów są używane w innych projektach, które nie są w tym samym rozwiązaniu, co projekt generujący pliki zasobów.Utwórz plik designer.cs z wygenerowanego pliku zasobów ResXRersourcewriter

Zastanawiam się teraz, czy możliwe jest wygenerowanie pliku designer.cs z pliku zasobów, dzięki czemu można uzyskać bezpośredni dostęp do zasobów bez korzystania z narzędzia resxresourcereader.

Odpowiedz

24

Otwórz plik Resx a na pasku narzędziowym jest menu Access Modifier. Ustaw to na Public. Spowoduje to wygenerowanie pliku *.Designer.cs.

enter image description here

+3

Plik projektu/TFS czasami się myli, gdy ludzie zmieniają nazwę resx. Wystarczy usunąć plik .cs i odtworzenie go za pomocą tego działa jak urok. – MartijnK

+2

Ustawienie modyfikatora dostępu do publicznego działało bez zarzutu - dzięki. – Mani5556

+0

Zapisanie Resources.resx wystarczy, nie trzeba zmieniać modyfikatora dostępu. –

3

Jeżeli plik zostanie dodany do Visual Studio Projektu trzeba ustawić właściwość pliku .resxCustom Tool do ResXFileCodeGenerator. Następnie VS automatycznie utworzy potrzebny plik projektanta.

W jednym z projektów stworzyłem skrypt T4, który skanuje folder w projekcie dla wszystkich obrazów i pozwala na utworzenie odpowiedniego pliku ressource za jednym kliknięciem.

Oto potrzebne część z skryptu 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"; 
} 

mam spłaszczone powyższy kod trochę, przyczyna w moim rzeczywistego rozwiązania użyć niestandardowej klasy dla każdego obrazu, zamiast prostego pliku również obsługuje tę samą nazwę pliku w różnych podfolderach (używając części struktury folderów do generowania przestrzeni nazw). Ale w przypadku pierwszego strzału powyższe powinno ci pomóc.

0

To również zadziałało dla mnie: kliknij dwukrotnie i otwórz plik Resx, dodaj zasób sztuczny, kliknij Zapisz. Plik .designer.cs jest generowany.

+0

Zapisanie 'Resources.resx' jest wystarczające, nie ma potrzeby stosowania atrapowego zasobu. –

0

Można również zrobić to w kodzie: (Taken from tutaj: 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(); 

Trzeba odwołać system.design.dll

0

Jeśli usuniesz je lub dodawać je do .gitignore ponieważ myślałeś, że go nie potrzebujesz. tak regenerujesz plik.

idź do modyfikatora dostępu i zmienić go z (publiczny/wewnętrzne) „No Code Generation”

Teraz umieścić go z powrotem do publicznego/wewnętrzne. VS ponownie wygeneruje plik Designer.

+0

Zapisanie 'Resources.resx' wystarczy, nie trzeba zmieniać' modyfikatora dostępu'. –

1

Kliknij prawym przyciskiem myszy na Resources.resx i wybierz "Uruchom narzędzie niestandardowe".

+0

To powinna być poprawna odpowiedź! –