2009-05-07 9 views
17

का उपयोग करती है मेरे पास एक पावरहेल स्क्रिप्ट है जो एक .NET असेंबली (मेरे मामले में .EXE) लोड कर रही है और एक एन्क्रिप्टेड कनेक्शन स्ट्रिंग खींचने के लिए app.config का उपयोग करने वाली सार्वजनिक विधि को कॉल कर रही है।पावरहेल कॉलिंग .NET असेंबली जो App.config

स्क्रिप्ट पावरहेल ($ pshome) फ़ोल्डर में powerhell.exe.config के रूप में गतिशील रूप से असेंबली के exe.config की प्रतिलिपि बनाता है और मेरे विकास बॉक्स से ठीक से चलाने में सक्षम है। समस्या यह है कि यह एक मानक विंडोज सर्वर 2003 स्थापना से नहीं चला है।

मैंने सत्यापित किया है कि exe.config को पावरहेल निर्देशिका में सही तरीके से कॉपी किया जा रहा है। मैंने SysInternals प्रक्रिया एक्सप्लोरर चलाया है और सत्यापित किया है कि प्रक्रिया कॉन्फ़िगरेशन फ़ाइलों तक पहुंच रही थी (कोई फ़ाइल संदेश नहीं मिली)। मैंने दूरस्थ रूप से powerhell.exe उदाहरण को डीबग किया है और देख सकता है कि असेंबली ठीक लोड हो रही है लेकिन ConfigurationManager.AppSettings [...] मानों तक पहुंच नहीं सकती है (शून्य वापस आती है)।

मैं विचारों से बाहर हूं। मैंने पढ़ा है कि मैं एक अलग ऐप डोमेन का उपयोग करने में सक्षम हो सकता हूं लेकिन मुझे पावरहेल के साथ ऐसा करने का कोई उदाहरण नहीं दिखता है।

मेरे कोड के प्रभाव से कुछ करता है:

$absolute_path = "c:\foo.exe" 
$config_path = $absolute_path + ".config" 
copy "$config_path" "$pshome\powershell.exe.config" -Force 
[Reflection.Assembly]::LoadFrom($absolute_path) 
$foo = new-object MyFooAssembly.FooClass 
$foo.DoSomething() 

Vista में कोड काम करता है, विंडोज सर्वर 2003 कोड काम नहीं करता है।

उत्तर

35

प्रयास करें:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path) 
+0

यदि यह काम करता है तो आप मेरा हीरो बनेंगे। –

+0

ने पुष्टि की कि यह वीएस -2008 में निर्मित एक नोडी असेंबली के साथ काम करता है और एक्सपी पर चल रहा है, डब्ल्यूएस2003 हाथ नहीं है, लेकिन मुझे उम्मीद है कि यह वहां भी काम करेगा। कृपया खुश रहें और खुश होने पर वोट दें :) –

+0

कुछ दिनों से लूप से बाहर हो गया, कल इसे एक शॉट देगा। धन्यवाद! – GabeA

4

आगे शोध करने के बाद मैं कारण पता चला। स्क्रिप्ट में एक पहले बिंदु पर मैं एसएमओ लोड कर रहा था:

$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 

मुझे विश्वास है कि यह मेरी कॉन्फ़िगरेशन सेटिंग्स को कैसे उलझाता है।

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null) 
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 

और फिर एक और विधानसभा के लिए मेरी दूसरी कॉल ऐसा करने पर: ठीक क्रिस इस कॉल करने के लिए ऊपर उल्लेख के रूप में करने के लिए था

$config_path = $assembly_exe + ".config" 
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path) 
[Reflection.Assembly]::LoadFrom($assembly_exe) 

समस्या को हल किया जा करने के लिए प्रकट होता है ...

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