2009-04-30 16 views
8

मैं XmlDocument क्लास का उपयोग करके और सीधे मान को संशोधित करके स्थापित समय पर बाध्यकारी रेडियोधर्मी तत्व को बदलने का प्रयास कर रहा हूं।app.config में असेंबली बाइंडिंग को प्रोग्रामेटिक रूप से संशोधित करने के लिए कैसे करें?

 

<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">    
      ... 
     </sectionGroup>  
    </configSections> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="MyDll" publicKeyToken="31bfe856bd364e35"/> 
      <bindingRedirect oldVersion="0.7" newVersion="1.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime>  
... 
</configuration> 
 

मैं तो 1,0 2,0

private void SetRuntimeBinding(string path, string value) 
    { 
     XmlDocument xml = new XmlDocument(); 


     xml.Load(Path.Combine(path, "MyApp.exe.config")); 
     XmlNode root = xml.DocumentElement; 

     if (root == null) 
     { 
      return; 
     } 

     XmlNode node = root.SelectSingleNode("/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect/@newVersion"); 

     if (node == null) 
     { 
      throw (new Exception("not found")); 
     } 

     node.Value = value; 

     xml.Save(Path.Combine(path, "MyApp.exe.config")); 

    } 

हालांकि करने के लिए, यह 'नहीं मिला' अपवाद फेंकता बदलने के लिए निम्नलिखित कोड का उपयोग करने का प्रयास करें: यहाँ मेरी app.config दिखता है की तरह है। यदि मैं पथ/कॉन्फ़िगर/रनटाइम तक पथ वापस करता हूं तो यह काम करता है। हालांकि एक बार जब मैं असेंबली बाइंडिंग जोड़ता हूं, तो उसे नोड नहीं मिलता है। शायद यह xmlns के साथ कुछ करने के लिए है? कोई विचार है कि मैं इसे कैसे संशोधित कर सकता हूं? कॉन्फ़िगरेशन प्रबंधक को इस खंड तक पहुंच नहीं है।

उत्तर

8

मुझे जो चाहिए वह मिला। XmlNamespaceManager की आवश्यकता होती है क्योंकि असेंबली बाइंडिंग नोड में xmlns विशेषता होती है। मैं इस का उपयोग करने के कोड को संशोधित किया है और यह काम करता है:

private void SetRuntimeBinding(string path, string value) 
    { 
     XmlDocument doc = new XmlDocument(); 

     try 
     { 
      doc.Load(Path.Combine(path, "MyApp.exe.config")); 
     } 
     catch (FileNotFoundException) 
     { 
      return; 
     } 

     XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
     manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1"); 

     XmlNode root = doc.DocumentElement; 

     XmlNode node = root.SelectSingleNode("//bindings:bindingRedirect", manager); 

     if (node == null) 
     { 
      throw (new Exception("Invalid Configuration File")); 
     } 

     node = node.SelectSingleNode("@newVersion"); 

     if (node == null) 
     { 
      throw (new Exception("Invalid Configuration File")); 
     } 

     node.Value = value; 

     doc.Save(Path.Combine(path, "MyApp.exe.config")); 
    } 
+1

बस एक नोट, मैंने अपवाद फेंक दिया क्योंकि यह एक सेटअप प्रोजेक्ट का हिस्सा है और इस तरह इंस्टॉलर को किसी भी त्रुटि के बारे में अधिसूचित किया जाता है। संशोधित होने पर विधि को सही या गलत वापस करना बेहतर होगा। – esac

-1

मुझे लगता है कि सही Xpath वाक्य रचना है:

/विन्यास/क्रम/assemblyBinding/dependentAssembly/bindingRedirect @ NewVersion

(आप एक स्लेश भी कई है)।

या अगर यह आप bindingRedirect तत्व (SelectSingleNode उपयोग करते हुए) को चुन सकते हैं काम नहीं करता:

/विन्यास/क्रम/assemblyBinding/dependentAssembly/bindingRedirect

तो विशेषता इस तत्व की NewVersion संशोधित करते हैं।

+0

पहले से ही इस पथ से नीचे चला गया है, यह बाध्यकारीRedirect @ newVersion के साथ अमान्य टोकन की शिकायत करता है। दूसरा मामला, यह शिकायत करता है कि यह निर्दिष्ट पथ नहीं मिला। – esac

8

ध्वनि आप अपने विन्यास फाइल अब काम कर रहा tweak मिल गया है की तरह है, लेकिन मैंने सोचा था कि तुम अब भी कैसे रन टाइम पर बाध्यकारी रीडायरेक्ट समायोजित करने के लिए में रुचि हो सकती। कुंजी AppDomain.AssemblyResolve घटना का उपयोग करना है, और विवरण this answer में हैं। मैं इसे कॉन्फ़िगरेशन फ़ाइल का उपयोग करने पर पसंद करता हूं, क्योंकि मेरी संस्करण संख्या तुलना थोड़ा अधिक परिष्कृत हो सकती है और मुझे प्रत्येक बिल्ड के दौरान कॉन्फ़िगरेशन फ़ाइल को ट्विक करने की आवश्यकता नहीं है।

+0

दोस्त! यह स्वीकार्य उत्तर होना चाहिए। – Jupaol

+3

यह काम करता है, अगर असेंबली लोड शुरू में विफल रहता है। हालांकि यदि आपका ऐप _wrong_ असेंबली को सफलतापूर्वक लोड करने का प्रबंधन करता है, तो असेंबली रीसोल्व कभी नहीं आग लगती है। तो उस मामले में एकमात्र विकल्प app.config को संशोधित करना है। – Phil

+0

इच्छा है कि मैं अपना वोट वापस ले सकता हूं। यह वास्तव में काम नहीं करता है यदि बाध्यकारी सेट है, .NET 4.6.1 के रूप में। अभी भी असेंबली बाध्यकारी असफलताओं को प्राप्त करें। – Nuzzolilo

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