2011-12-26 9 views
14

के साथ संसाधन असेंबली बनाएं परिदृश्य: मैं सैटेलाइट असेंबली बनाना चाहता हूं जो संसाधन असेंबली हैं। इस असेंबली में केवल संसाधनों को संकलित किया गया है (संसाधन लेखक)। लक्ष्य वी.एस. के बाहर संसाधन विधानसभाओं बनाने और उन्हें आवेदन में जोड़ने के लिए है और यह मेरा सी # आवेदनअसेंबलीबिल्डर

एटीएम मैं में AssemblyBuilder का उपयोग कर विधानसभा बनाने के लिए। यह काम करता है लेकिन संग्रहीत असेंबली के बारे में कोई जानकारी नहीं है। कोई संस्कृतिइन्फो, कुंजी या कुछ भी नहीं। असेंबली को अनुपलब्ध मैनफाईस रिसोर्स अपवाद के साथ ऐप द्वारा नहीं लिया गया है। :(

मैं AssemblyBuilder या CodeDomProvider उपयोग करने के साथ रहना चाहते हैं यदि संभव हो तो

प्रश्न:। क्या मेरे ऐप पर नए उपग्रह विधानसभा जोड़ने के लिए सक्षम होने के लिए जरूरी है कि यह पर्याप्त के साथ एक फ़ोल्डर के लिए है? संस्कृति (en-US) और वहाँ en-US संसाधनों के साथ एक विधानसभा

Question2? यह संस्करण की तरह कुछ मेटा जानकारी, संस्कृति विधानसभा को देने के लिए

संभव है प्रश्न 3: असेंबली में संसाधन जोड़ने के लिए पर्याप्त नहीं है?

कोड:

AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(
         assemblyName, AssemblyBuilderAccess.RunAndSave, resourceFolder); 

builder.AddResourceFile(name, assemblyFileName); 
builder.Save(assemblyName.Name); 

मदद के किसी भी प्रकार मैं आभारी होंगे लिए। अग्रिम धन्यवाद

उत्तर

4

समाधान मिले देखें।

स्रोत: http://www.dotnet247.com/247reference/msgs/58/290731.aspx

स्पष्टीकरण: सबसे पहले ऐसा लगता है AssemblyBuilder केवल विधानसभा, इसके एम्बेडेड नहीं करने के लिए संसाधन लिंक। दूसरा संसाधन मॉड्यूल में होने की मुख्य विधानसभा द्वारा देखा जाना चाहिए। (मैं मॉड्यूल के भीतर संसाधन टोकरा को नापसंद करते हैं लेकिन वहाँ एम्बेडेड पहले से ही विद्यमान संसाधन के लिए कोई रास्ता नहीं हो रहा है)

कोड:

 string myAsmName = "WriteSatelliteAssembly.resources"; 
     string myAsmFileName = myAsmName + ".dll"; 
     string resourceName = "WriteSatelliteAssembly.MyResource2.fr.resources"; 
     string path; 

     path = AppDomain.CurrentDomain.BaseDirectory + "fr-FR"; 
     AppDomain appDomain = Thread.GetDomain(); 
     AssemblyName asmName = new AssemblyName(); 
     asmName.Name = myAsmName; 
     asmName.CodeBase = path; 
     asmName.CultureInfo = new CultureInfo("fr"); 

     AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(
      asmName, 
      AssemblyBuilderAccess.RunAndSave, path); 

     **ModuleBuilder** myModuleBuilder = 
      myAsmBuilder.DefineDynamicModule(myAsmFileName, 
      myAsmFileName); 
     **IResourceWriter** rw = 
      myModuleBuilder.DefineResource(resourceName, 
      "My Description",ResourceAttributes.Public); 

     rw.AddResource("resName","My (dynamic) resource value."); 
     rw.AddResource("resName2","My (dynamic) second resource value."); 

     myAsmBuilder.Save(myAsmFileName); 

सबूत shortend: में

लिंक्ड संसाधन असेंबली

.file nometadata 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
    .hash = (57 DD 82 37 9E B3 BA 8A 27 D0 69 90 37 67 22 23 // W..7....'.i.7g"# 
      A0 1C F7 47)          // ...G 
.mresource public TestProjectResourceManager.Properties.Resources 
{ 
    .file 'TestProjectResourceManager.Properties.Resources.en-US.resources' at 0x00000000 
} 

विधानसभा में एम्बेडेड संसाधन

.mresource public 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
{ 
    // Offset: 0x00000000 Length: 0x000000EE 
} 
.module TestProjectResourceManager_2.resources.dll 

मज़ा

+0

मैं इसे देखूंगा नि: शुल्क समय में, साझा करने के आपके प्रयासों को ऊपर उठाया;) –

+0

इसके अलावा आप अपने उत्तर को भी स्वीकार कर सकते हैं अगर आपको लगता है कि यह वास्तव में आप के बाद क्या था। –

2

आपको असेंबली बनाने के लिए निम्नलिखित टूल की आवश्यकता होगी।

  1. resgen.exe
  2. al.exe
  3. ildasm.exe

al.exe कार्यक्रम है कि एक उपग्रह विधानसभा में संसाधनों एम्बेड करता है। लेकिन al.exe केवल संसाधनों को बार्सरी प्रारूप में स्वीकार करेगा। लेकिन हमारे इनपुट आमतौर पर सादा पाठ संसाधन फ़ाइलों या XML-आधारित संसाधन फ़ाइलों को .resx प्रारूप में होते हैं। resgen.exe का उपयोग संसाधनों के इन वैकल्पिक रूपों को बदलने के लिए किया जाता है .resources बाइनरी प्रारूप al.exe को palatable।

ildasm.exe: यदि आपको याद है कि विजुअल स्टूडियो आईडीई क्या कर रहा है, तो आप देखेंगे कि आपके संसाधन फ़ाइल निर्देशिका संरचना के बीच एक नाम अनुवाद है और यह संसाधन फ़ाइल असेंबली के अंदर कैसे जानी जाती है। Becaue हम उपग्रह संसाधनों को उत्पन्न करने के लिए डिफ़ॉल्ट संसाधनों और बाह्य प्रक्रिया उत्पन्न करने के लिए विजुअल स्टूडियो आईडीई का उपयोग कर रहे हैं, दोनों तंत्रों को संसाधन फ़ाइलों के लिए समान नामकरण पदानुक्रम के साथ असेंबली का उत्पादन करना होगा।

इसलिए हम डीएलएल की जांच करने के लिए ildasm का उपयोग करते हैं कि विजुअल स्टूडियो आईडीई संरचना का पता लगाने के लिए उत्पन्न करता है, और सैटेलाइट असेंबली उत्पन्न करने के लिए उसी तंत्र का उपयोग करता है। यह सुनिश्चित करने के लिए कि आप सही नाम प्राप्त करते हैं, आप ildasm का उपयोग करके उपग्रह असेंबली की भी जांच कर सकते हैं। यह संसाधन प्रबंधक से त्रुटियों को डीबग करने के लिए उपयोगी होगा जो आपको बता रहा है कि यह संसाधन का पता नहीं लगा सकता है।

अब उपकरण बताए गए हैं, हम बाहरी संसाधन फ़ाइल को उपग्रह असेंबली में कैसे परिवर्तित कर सकते हैं? जैसा कि नीचे बताया गया है, यह एक तीन (वास्तव में, दो) चरण प्रक्रिया है।

चरण 0: resgen और al.exe के लिए अपने पथ सेट करें:

@set path=%path%; 
    "C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin"; 
    c:\winnt\microsoft.NET\framework\v1.0.3705 

चरण 1: उपयोग resgen एक .resx फ़ाइल से एक .resources फ़ाइल बनाने के लिए।

Resgen MyText.resx 

उपरोक्त आदेश एक फ़ाइल कहा जाता है पैदा करेगा:

MyText.resources 

चरण 2:

Al.exe 
    /t:lib 
    /embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources 
    /culture:hi-gb 
    /out:MyApplication.resources.dll 

लायक चीजों की एक जोड़ी हैं: al.exe उपग्रह विधानसभा बनाने के लिए प्रयोग करें यहां नोटिंग:

/t:lib: Says you are interested in a .dll. 

/embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources : Embeds and renames the resource to a target name to match the Visual Studio IDE naming structure. 

/culture:hi-gb : Identifies the culture in which you are interested. 

/out:MyApplication.resources.dll : Name of the DLL in which you are interested. 

उत्पन्न .dll नेट के लिए नामकरण परिपाटी यह पता लगाने के लिए कि होना आवश्यक है। यह भी ध्यान दें कि आप संस्कृति सेटिंग निर्दिष्ट करने के लिए, भले ही संस्कृति संसाधन फ़ाइलों के नाम पर उपलब्ध है है। तो यह दोनों जगहों में उल्लेख किया जाना चाहिए।

प्लेस उचित निर्देशिका में उपग्रह विधानसभा एक बार उपग्रह विधानसभा बनाया जाता है, शारीरिक रूप से निम्न निर्देशिका में .dll कॉपी:

\MyApplication\bin\en-gb\MyApplication.Resources.DLL 

कई संसाधन फ़ाइलों के मामले में:

\MyApplication\resources\files\CommonResources.resx 
\MyApplication\resources\files\Module1Resources.resx 
\MyApplication\resources\files\Module2Resources.resx 

और आप इन संसाधनों के लिए एक अलग पदानुक्रम में कुंजी परिभाषित कर सकते हैं, निम्नानुसार:

\MyApplication\resources\keys\CommonKeys.cs 
\MyApplication\resources\keysModule1Keys.cs 
\MyApplication\resources\keys\Module2Keys.cs 

एक बैच कार्यक्रम स्क्रिप्ट के लिए, मेरे ब्लॉग http://samithenerd.blogspot.com/2011/12/batch-program-for-creating-satellite.html

+0

boah THX यू बहुत बहुत मैं उर जवाब का अध्ययन करेंगे लेकिन खुलकर मैं अपने कार्यक्रम (कोड) – Orri

+0

ठीक भीतर करना चाहते हैं होना है, मुझे यह करने के लिए देख सकते हैं और वापस मिलता है। – CodeMad

+0

मुझे आपके लिस्टिंग के ** स्रोत ** को सह मिला। http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=1 – Orri