2013-01-04 12 views
9

मुझे एक प्रोग्राम मिला है जो .resx संसाधन फ़ाइलों को उत्पन्न करता है। उन संसाधन फ़ाइलों का उपयोग अन्य परियोजनाओं में किया जाता है, जो कि संसाधन फ़ाइलों को उत्पन्न करने वाली परियोजना के समान समाधान में नहीं है।ResXRersourcewriter जेनरेट की गई संसाधन फ़ाइल से designer.cs फ़ाइल बनाएं

अब मुझे आश्चर्य है, अगर संसाधन फ़ाइल से designer.cs फ़ाइल उत्पन्न करना संभव है, ताकि आप resxresourcereader का उपयोग किये बिना सीधे संसाधनों तक पहुंच सकें।

उत्तर

24

resx फ़ाइल को इसके टूलबार पर खोलें, वहां Access Modifier मेनू है। इसे Public पर सेट करें। यह *.Designer.cs फ़ाइल उत्पन्न करेगा।

enter image description here

+3

लोग फ़ाइल/टीएफएस कभी-कभी भ्रमित हो जाते हैं जब लोग resx का नाम बदलते हैं। बस .cs फ़ाइल को हटाएं और इस काम का उपयोग करके एक आकर्षण की तरह इसे पुन: प्रयास करें। – MartijnK

+2

सार्वजनिक रूप से एक्सेस मॉडिफायर सेट करना बेकार ढंग से काम करता है - धन्यवाद। – Mani5556

+0

संसाधनों को सहेजना .resx पर्याप्त है, एक्सेस संशोधक को बदलने की कोई आवश्यकता नहीं है। –

3

फ़ाइल एक दृश्य स्टूडियो परियोजना में जोड़ा जाता है, तो आप ResXFileCodeGenerator को .resx फ़ाइल के Custom Tool गुण सेट करने के लिए है। फिर वीएस स्वचालित रूप से आवश्यक डिजाइनर फ़ाइल बना देगा।

एक प्रोजेक्ट में मैंने एक टी 4 स्क्रिप्ट बनाई जो सभी छवियों के लिए प्रोजेक्ट के भीतर फ़ोल्डर को स्कैन करता है और एक क्लिक पर एक संबंधित रिसोर्स फ़ाइल बनाने देता है।

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"; 
} 

मैं अपने वास्तविक समाधान में उपरोक्त कोड एक छोटा सा, कारण चपटा मैं सरल फ़ाइल नाम के बजाय प्रत्येक तस्वीर के लिए एक कस्टम वर्ग का उपयोग करें:

यहाँ टी -4 स्क्रिप्ट से बाहर की जरूरत हिस्सा है विभिन्न उप फ़ोल्डरों में उसी फ़ाइल नाम का समर्थन करने के लिए (नामस्थान पीढ़ी के लिए फ़ोल्डर संरचना का एक हिस्सा उपयोग करके)। लेकिन उपरोक्त शॉट के लिए ऊपर की मदद करनी चाहिए।

0

यह मेरे लिए भी काम करता है: दो बार क्लिक करें और resx फ़ाइल खोलें, एक डमी संसाधन जोड़ें, सहेजें पर क्लिक करें। .designer.cs फ़ाइल जेनरेट की गई है।

+0

'Resources.resx' को सहेजना पर्याप्त है, डमी संसाधन की कोई आवश्यकता नहीं है। –

0

तुम भी कोड में यह कर सकते हैं: (यहाँ से लिया: 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(); 

आप इसे हटाए जाने या .gitignore में जोड़ा तो system.design.dll

0

को संदर्भित करने की जरूरत है क्योंकि आपने सोचा था कि आपको इसकी आवश्यकता नहीं है। इस प्रकार आप फ़ाइल को पुन: उत्पन्न करते हैं।

जाओ पहुँच संशोधक के लिए और (सार्वजनिक/आंतरिक) करने के लिए "नो कोड जनरेशन"

से इसे बदल अब यह पब्लिक/आंतरिक वापस करने के लिए डाल दिया। वीएस आपके लिए डिज़ाइनर फ़ाइल को पुन: उत्पन्न करेगा।

+0

'resource.resx' को सहेजना पर्याप्त है,' एक्सेस संशोधक 'को बदलने की कोई आवश्यकता नहीं है। –

1

Resources.resx पर राइट क्लिक करें और "कस्टम टूल चलाएं" का चयन करें।

+0

यह सही जवाब होना चाहिए! –

संबंधित मुद्दे