2010-07-30 14 views
53

मैं वर्तमान में सी # में एक पुस्तकालय लिख रहा हूं और कुछ मौकों पर इसे तुरंत परीक्षण करने के लिए पावरशेल का उपयोग कर रहा था। हालांकि, यह मुझे परियोजना को फिर से बनाने से रोकता है क्योंकि पावरशेल स्पष्ट रूप से अभी भी डीएलएल खुला है।क्या आप फिर से PowerShell में एड-एड प्रकार को हटा सकते हैं?

क्या Add-Type के साथ इसे जोड़ने के बाद फिर से डीएलएल को उतारने का कोई तरीका है? प्रलेखन में उस पर संकेत नहीं लगते हैं और स्पष्ट उम्मीदवार Remove-Type (जो अस्तित्व में नहीं है - Type के साथ इसके नाम के रूप में केवल एक ही आदेश है)। PowerShell को बंद करने के लिए यह बोझिल हो जाता है और निर्माण निर्देशिका में नेविगेट करने की सभी चीजें करता है और जब भी मैं पुनर्निर्माण करना चाहता हूं तो फिर से टाइप जोड़ना।

उत्तर

49

अन्य लोगों की तरह कहते हैं, यह एक .NET व्यवहार है। ऐपडोमेन में लोड की गई असेंबली को अनलोड नहीं किया जा सकता है। केवल ऐपडोमेन को अनलोड किया जा सकता है, और पावरहेल एक एकल एपडोमेन का उपयोग करता है। मैंने कुछ साल पहले इस बारे में कुछ ब्लॉग किया: http://www.nivot.org/2007/12/07/WhyAppDomainsAreNotAMagicBullet.aspx

जब मैं इस तरह परीक्षण करता हूं, तो मैं आमतौर पर एक खोल खोलता हूं और परीक्षण करने के लिए घोंसला वाले खोल का उपयोग करता हूं। पावरहेल शुरू करें, सीडी से बिन स्थान पर फिर से शुरू करने के लिए नेस्टेड खोल (नई प्रक्रिया।) "बाहर निकलें" शुरू करने के लिए "पावरहेल" चलाएं और फिर "पावरहेल" चलाएं।

0

मुझे इसी तरह की समस्या का सामना करना पड़ रहा है। किसी प्रकार/असेंबली को अनलोड करना संभव नहीं है (ऐसा इसलिए है क्योंकि यह .NET ढांचे पर लागू होता है)।

.NET में यदि आप एक नया एप्लिकेशन डोमेन (System.AppDomain) क्रेट करते हैं और उस डोमेन में असेंबली लोड करते हैं तो आप इसे हल कर सकते हैं। ऐप डोमेन को अनलोड करना संभव है और यह सभी डीएलएस को भी उतार देता है।

मैंने अभी तक यह कोशिश नहीं की है, क्योंकि मेरे लिए Console में एक टैब को बंद करना और नया खोलना बहुत आसान है।

+0

पावरहेल केवल एक ही ऐपडोमेन का उपयोग करता है, एक नया ऐपडोमेन बनाता है, उस ऐपडोमेन में टाइप लोड करता है और फिर एपडोमेन को उतारने से टाइप को अनलोड नहीं किया जाता है। –

20

अपने विधानसभा की आवश्यकता नहीं है एक binding context आप यह कर सकते हैं:

$bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll") 
[System.Reflection.Assembly]::Load($bytes) 
+0

और यह कैसे असेंबली को उतारना संभव बनाता है? –

+5

आप अनलोड करने में सक्षम नहीं होंगे, लेकिन ओएलओएच डीएलएल को खुला और लॉक नहीं रखा जाएगा क्योंकि पाठ लोड से स्वतंत्र है ('ReadAllBytes' फ़ाइल को खुला या लॉक नहीं रखता है)। तो यह ओपी चाहता है पर निर्भर करता है; यह "मैं नहीं बना सकता" की समस्या को ठीक कर दूंगा जो एक अनलोड के लिए ड्राइवर था। –

+2

मैं आपको एक पिंट देना चाहता हूं। – samaspin

31

मुझे इस समस्या को हल करने का सबसे आसान तरीका Add-Type और Start-Job के अंदर परीक्षण कोड को लपेटना है। Start-Job पृष्ठभूमि प्रक्रिया तैयार करेगा, और प्रकार वहां लोड किया जाएगा। एक बार पूरा हो जाने के बाद, प्रक्रिया दूर हो जाती है और आप पुनः प्रयास करने के लिए स्वतंत्र हैं।

$job = Start-Job -ScriptBlock { 

    Add-Type -path 'my.dll' 
    $myObj = new-object My.MyTestClassName 

    $result = $myObj.TestMethod 
    $result 
} 
Wait-Job $job 
Receive-Job $job 

परीक्षा पद्धति से उत्पादन कंसोल के लिए गूँजती किया जाएगा:

यहाँ यह कैसे लग रहा है, इसका एक उदाहरण।

# Start-Job will not preserve the working directory, so do it manually 
# Other arguments can also be passed to the job this way 
$cd = Split-Path $MyInvocation.MyCommand.Path 
$jobParams = @{ 
    'cd' = $cd 
} 

Start-Job -InputObject $jobParams -ScriptBlock { 
    cd $Input.cd 
    Add-Type -Path assembly.dll 
} | Receive-Job -Wait -AutoRemoveJob 

Receive-Job -Wait सुनिश्चित करें कि काम के उत्पादन के बाद से प्राप्त होता है कर देगा:

+1

मुझे यह विधि पसंद है, हालांकि मेरे मामले में मुझे पृष्ठभूमि नौकरी में एक चर सेट के परिणाम की आवश्यकता है। इसे फ़ाइल में लिखने के बिना, मुझे यकीन नहीं है कि मुझे वह जानकारी कैसे प्राप्त होगी। फिर भी, मुझे लगता है कि यह +1 –

+1

@SlogmeisterExtraordinaire के लिए योग्य है, परिणाम में गूंजें। मुख्य लिपि में, इसे प्राप्त करने के लिए 'प्राप्त करें-नौकरी' पर कॉल करें। –

+1

मैंने यह कैसे किया है इसका एक उदाहरण जोड़ा। उदाहरण में कोई भी टाइपो या गलतियां अकेली हैं, न कि @ स्टार्ट-ऑटोमेटिंग। –

2

यहां एक संपूर्ण उदाहरण है कि एक बार यह खत्म ताकि विधानसभा उतार दिया है एक पृष्ठभूमि के रूप में काम Add-Type आदेश को चलाने के लिए अनुमति देता है अन्यथा यह खो जाएगा।

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