.NET असेंबली को Powershell सत्र में ठीक से कैसे जोड़ें?


24

मेरे पास .NET असेंबली (एक dll) है जो कि हमारे द्वारा उपयोग किए जाने वाले बैकअप सॉफ़्टवेयर के लिए एक एपीआई है। इसमें कुछ गुण और विधियाँ शामिल हैं जिन्हें मैं अपनी पॉवर्सशेल स्क्रिप्ट (ओं) का लाभ उठाना चाहूंगा। हालांकि, मैं पहले लोडिंग असेंबली के साथ बहुत सारे मुद्दों पर चल रहा हूं, फिर असेंबली लोड होने के बाद किसी भी प्रकार का उपयोग कर रहा हूं।

संपूर्ण फ़ाइल पथ है:

C:\rnd\CloudBerry.Backup.API.dll

शक्तियों में मैं का उपयोग करें:

$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath

मुझे नीचे त्रुटि मिली:

Add-Type : Unable to load one or more of the requested types. Retrieve the
LoaderExceptions property for more information.
At line:1 char:9
+ Add-Type <<<<  -Path $dllpath
+ CategoryInfo          : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
+ FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeComma
ndAdd-Type : Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

किसी अन्य .NET असेंबली, DotNetZip पर उसी cmdlet का उपयोग करना , जिसमें साइट पर समान कार्यक्षमता का उपयोग करने के उदाहरण भी मेरे लिए काम नहीं करते हैं।

मुझे अंततः पता चलता है कि मैं प्रतिबिंब का उपयोग करके विधानसभा को लोड करने में सक्षम हूं:

[System.Reflection.Assembly]::LoadFrom($dllpath)

यद्यपि मुझे यह तरीका लोड, लोडफ्रेम, या लोडफाइल के बीच के अंतर को नहीं समझता है, जो अंतिम विधि काम करती है।

हालाँकि, मैं अभी भी उदाहरण बनाने या वस्तुओं का उपयोग करने में असमर्थ प्रतीत होता हूं। जितनी बार मैं कोशिश करता हूं, मुझे ऐसी त्रुटियां मिलती हैं, जो बताती हैं कि पॉवर्सल किसी भी प्रकार के सार्वजनिक को खोजने में असमर्थ हैं।

मुझे पता है कि वहाँ कक्षाएं हैं:

$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static

---- अंश का प्रारंभ ----

   TypeName: CloudBerryLab.Backup.API.BackupProvider

Name                MemberType Definition
----                ---------- ----------
PlanChanged         Event          System.EventHandler`1[CloudBerryLab.Backup.API.Utils.ChangedEventArgs] PlanChanged(Sy...
PlanRemoved         Event          System.EventHandler`1[CloudBerryLab.Backup.API.Utils.PlanRemoveEventArgs] PlanRemoved...
CalculateFolderSize Method     static long CalculateFolderSize()
Equals              Method     static bool Equals(System.Object objA, System.Object objB)
GetAccounts         Method     static CloudBerryLab.Backup.API.Account[],     CloudBerry.Backup.API, Version=1.0.0.1, Cu...
GetBackupPlans      Method     static CloudBerryLab.Backup.API.BackupPlan[], CloudBerry.Backup.API, Version=1.0.0.1,...
ReferenceEquals     Method     static bool ReferenceEquals(System.Object objA, System.Object objB)
SetProfilePath      Method     static System.Void SetProfilePath(string profilePath)

---- अंश का अंत ----

स्थैतिक तरीकों का उपयोग करने की कोशिश विफल, मुझे नहीं पता क्यों !!!

[CloudBerryLab.Backup.API.BackupProvider]::GetAccounts()
Unable to find type [CloudBerryLab.Backup.API.BackupProvider]: make sure that the     assembly containing this type is load
ed.
At line:1 char:42
+ [CloudBerryLab.Backup.API.BackupProvider] <<<< ::GetAccounts()
    + CategoryInfo          : InvalidOperation:     (CloudBerryLab.Backup.API.BackupProvider:String) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

किसी भी मार्गदर्शन की सराहना की !!

जवाबों:


15

क्या आप Add-Typeएक कैच पकड़ने के साथ घेर सकते हैं और लोडर एक्सेप्शन प्रॉपर्टी को प्रिंट कर सकते हैं, जैसा कि त्रुटि करना है। यह अधिक विस्तृत त्रुटि संदेश के साथ एक अपवाद प्रदान कर सकता है।

try
{
    Add-Type -Path "C:\rnd\CloudBerry.Backup.API.dll"
}
catch
{
    $_.Exception.LoaderExceptions | %
    {
        Write-Error $_.Message
    }
}

9
यह मेरे लिए काम नहीं किया, लेकिन यह मुझे बॉलपार्क में मिला। कैच के अंदर, LoaderException ऑब्जेक्ट यहां स्थित है: $ _। अपवाद। LoaderException
Brett

सापेक्ष पथ का उपयोग करने का कोई तरीका नहीं है?
अमित

3

मुझे यह लिंक मिला: http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassass-s.html

वह कहते हैं, ".LadWithPartialName" को हटा दिया गया है। इसलिए, उस पद्धति के साथ ऐड-टाइप को लागू करने के लिए जारी रखने के बजाय, यह "आंशिक नाम" को "पूर्ण नाम" में अनुवाद करने के लिए एक स्थिर, आंतरिक तालिका का उपयोग करता है। प्रश्न में दिए गए उदाहरण में, CloudBerry.Backup.API.dllPowerShell की आंतरिक तालिका में प्रविष्टि नहीं है, यही कारण है कि [System.Reflection.Assembly]::LoadFrom($dllpath)काम करता है। यह आंशिक नाम देखने के लिए तालिका का उपयोग नहीं कर रहा है।


2

ऊपर दिए गए कुछ तरीके मेरे लिए काम नहीं करते थे या अस्पष्ट थे।

यहाँ मैं 'AddPath' कॉल को लपेटने और LoaderException को पकड़ने के लिए उपयोग करता हूँ:

try
{
   Add-Type -Path "C:\path\to.dll"
}
catch [System.Reflection.ReflectionTypeLoadException]
{
   Write-Host "Message: $($_.Exception.Message)"
   Write-Host "StackTrace: $($_.Exception.StackTrace)"
   Write-Host "LoaderExceptions: $($_.Exception.LoaderExceptions)"
}

संदर्भ
https://social.technet.microsoft.com/Forums/sharepoint/en-US/dff8487f-69af-4b64-ab83-13d58a55c523/addtype-inheritance-loaderexception


0

मैंने निम्नलिखित सेटअप का उपयोग पॉवरशेल में एक कस्टम csharp नियंत्रण को लोड करने के लिए किया था। यह नियंत्रण को पॉवरशेल के भीतर से अनुकूलित और उपयोग करने की अनुमति देता है।

यहाँ ब्लॉग लिंक है

http://justcode.ca/wp/?p=435

और यहाँ स्रोत के साथ कोडप्रोजेक्ट लिंक है

http://www.codeproject.com/Articles/311705/Custom-CSharp-Control-for-Powershell


3
सर्वर दोष में आपका स्वागत है! हम वास्तव में पसंद करते हैं कि उत्तर में सामग्री न होने के संकेत होते हैं। जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना बेहतर होगा , और संदर्भ के लिए लिंक प्रदान करना होगा।
jscott

0

LoaderExceptionsत्रुटि रिकॉर्ड के अंदर छिपे हुए हैं। यदि ऐड-टाइप त्रुटि त्रुटि सूची में अंतिम एक थी, $Error[0].InnerException.LoaderExceptionsतो त्रुटियों को दिखाने के लिए उपयोग करें। सबसे अधिक संभावना है, आपका पुस्तकालय दूसरे पर निर्भर है जिसे लोड नहीं किया गया है। आप या तो Add-Typeहर एक को, या सिर्फ एक सूची बना सकते हैं और -ReferencedAssembliesतर्क का उपयोग कर सकते हैं Add-Type


$ त्रुटि [0] .Exception.LoaderException और Eris की सलाह का पालन करने का प्रयास करें।
ताहिर हसन

-1

मैं तुम्हें अब तक लगता है कि शायद इस घटना का जवाब मिल गया है। मैं उसी समस्या का सामना करने के बाद इस पद पर आया था ... मैं विधानसभा को लोड कर सकता था, और विधानसभा में निहित प्रकारों को देख सकता था, लेकिन एक स्थिर वर्ग से इसका उदाहरण नहीं दे पा रहा था। क्या यह सही था। साफ, EFTidyNet.TidyNet.Options या क्या? Ooooo Weeee ... समस्याएं ... समस्याएं ... यह कुछ भी हो सकती हैं। और डीएलएल के स्थिर तरीकों और प्रकारों को देखने से कुछ भी आशाजनक नहीं हुआ। अब मैं उदास हो रहा था। मैं इसे एक संकलित C # कार्यक्रम में काम कर रहा था, लेकिन मेरे उपयोग के लिए मैं इसे एक अंतर्निर्मित भाषा में चलाना चाहता था ... शक्तियां।

मेरा समाधान मुझे मिला, और यह अभी भी सिद्ध हो रहा है, लेकिन मैं अभिन्न हूं और इसे साझा करना चाहता हूं। एक छोटे से कंसोल। Exe ऐप का निर्माण करें, जिसमें मैं उस फंक को एक्सरसाइज कर रहा था जिसमें मुझे दिलचस्पी थी और फिर इसे कुछ इस तरह से देखें कि यह डिकॉम्प्लिमेंट करेगा या आईएल कोड दिखाएगा। मैंने रेड-गेट के रिफ्लेक्टर और पॉवरशेल लैंग्वेज जनरेटर ऐड-इन और वालेह का इस्तेमाल किया! यह दर्शाता है कि उचित कंस्ट्रक्टर स्ट्रिंग क्या था! :-) कोशिश करो। और मुझे उम्मीद है कि यह इस समस्या का सामना कर रहा है।


2
और ... उचित कंस्ट्रक्टर स्ट्रिंग क्या था? यह वास्तव में उस प्रश्न का उत्तर नहीं देता है जिस तरह से लिखा गया है। इसके अलावा, ServerFault में आपका स्वागत है!
ऑस्‍ट्रिनियाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.