dll - क्या आप PowerShell में एड-एड टाइप को फिर से हटा सकते हैं?




add-type (4)

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

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


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

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


मुझे इस समस्या को हल करने का सबसे आसान तरीका Start-Job के अंदर Add-Type और टेस्ट कोड को लपेटना है। 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

परीक्षण विधि से आउटपुट कंसोल पर प्रतिबिंबित किया जाएगा।


यदि आपकी असेंबली को बाध्यकारी संदर्भ की आवश्यकता नहीं है तो आप यह कर सकते हैं:

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

यहां एक पूरा उदाहरण दिया गया है जो Add-Type कमांड को बैकग्राउंड जॉब के रूप में चलाने की इजाजत देता है ताकि विधानसभा समाप्त होने के बाद असेंबली हो:

# 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 यह सुनिश्चित करेगा कि नौकरी का उत्पादन प्राप्त हो जाएगा अन्यथा यह खो जाएगा।