পাওয়ার শেল সেশনে .NET অ্যাসেম্বলিগুলি কীভাবে যুক্ত করতে হয়?


24

আমার কাছে .NET সমাবেশ (একটি dll) আছে যা আমরা এখানে ব্যবহার করি এমন ব্যাকআপ সফ্টওয়্যারের একটি API। এটিতে আমার পাওয়ারশেল স্ক্রিপ্ট (গুলি) এর সুবিধা নিতে চাই এমন কয়েকটি বৈশিষ্ট্য এবং পদ্ধতি রয়েছে। যাইহোক, আমি প্রথম সমাবেশটি লোড করে অনেকগুলি বিষয় নিয়ে চলেছি, তারপরে সমাবেশটি লোড হয়ে গেলে কোনও ধরণের ব্যবহার করে using

সম্পূর্ণ ফাইল পাথটি হ'ল:

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 একই cmdlet ব্যবহার সমাবেশ, DotNetZip , যা সাইটে একই কার্যকারিতা ব্যবহারের উদাহরণ আছে আমার জন্য কাজ করে না।

আমি শেষ পর্যন্ত দেখতে পাচ্ছি যে আমি প্রতিবিম্বটি ব্যবহার করে অ্যাসেম্বলি লোড করতে আপাতদৃষ্টিতে সক্ষম হয়েছি:

[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ব্যবহার করে দেখুন ধরা এবং LoaderExceptions সম্পত্তি প্রিন্ট, যেমন ত্রুটি করতে জানায় করা হয়। এটি আরও বিস্তারিত ত্রুটি বার্তা সহ একটি ব্যতিক্রম সরবরাহ করতে পারে।

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

9
এটি আমার পক্ষে কাজ করে নি, তবে এটি আমাকে বলপার্কে পেয়েছে। ক্যাচের অভ্যন্তরে, লোডারএক্সেপশন অবজেক্টটি এখানে অবস্থিত: $ _। ব্যতিক্রম L লোডার অনুগ্রহ
ব্রেট

আপেক্ষিক পথ ব্যবহার করার উপায় নেই?
অমিত

3

আমি এই লিঙ্কটি পেয়েছি: http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionasorses-in.html

তিনি বলেছেন, ".লডউইথ পার্টিয়ালনেম" হ্রাস করা হয়েছে। অতএব, সেই পদ্ধতির সাথে অ্যাড-টাইপ প্রয়োগ করা চালিয়ে যাওয়ার পরিবর্তে, এটি "আংশিক নাম" "পুরো নাম" তে অনুবাদ করতে একটি স্থিতিশীল, অভ্যন্তরীণ সারণী ব্যবহার করে। প্রশ্নে দেওয়া উদাহরণে, CloudBerry.Backup.API.dllপাওয়ারশেলের অভ্যন্তরীণ সারণিতে কোনও প্রবেশ নেই, যে কারণে এটি [System.Reflection.Assembly]::LoadFrom($dllpath)কাজ করে। এটি কোনও আংশিক নাম সন্ধান করতে টেবিলটি ব্যবহার করছে না।


2

উপরের কয়েকটি পদ্ধতি আমার পক্ষে কার্যকর হয়নি বা অস্পষ্ট ছিল।

এখানে আমি অ্যাডপথ কলগুলি মোড়ানোর জন্য এবং লোডারএক্সেপশনগুলি ধরার জন্য যা ব্যবহার করি তা এখানে:

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.mic Microsoft.com/ Forums/ sharePoint/ en- US/ dff8487f- 69af- 4b64- ab83-13d58a55c523/ addtype- inheritance-
loaderexferences


0

পাওয়ারশেলের কাস্টম সিশার্প নিয়ন্ত্রণ লোড করতে আমি নীচের সেটআপটি ব্যবহার করেছি। এটি পাওয়ারশেলের মধ্যে থেকে নিয়ন্ত্রণটিকে কাস্টমাইজ এবং ব্যবহার করতে দেয়।

এখানে ব্লগ লিঙ্ক

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] .আপনিপশন.লুডার অনুভূতি এবং এরিসের পরামর্শ অনুসরণ করুন।
তাহির হাসান

-1

আমি তোমাদের এখন দ্বারা অনুমান পারে এই ঘটনা একটি উত্তর খুঁজে পেয়েছি। একই সমস্যা দেখা দেওয়ার পরে আমি এই পোস্টটিতে ছুটে এসেছি ... আমি সমাবেশটি লোড করতে পারি এবং সমাবেশে থাকা প্রকারগুলি দেখতে পারি, তবে স্থির শ্রেণীর কাছ থেকে এটির কোনও উদাহরণ স্বীকৃতি দিতে পারিনি। এটা কি এফটিডিওয়াই ছিল? পরিপাটি, EFTidyNet.TidyNet.Options বা কি? ওওও ওয়েই ... সমস্যা ... সমস্যা ... এটি যে কোনও কিছু হতে পারে। এবং ডিএলএল এর স্থিতিশীল পদ্ধতি এবং প্রকারগুলি অনুসন্ধান করে আশাব্যঞ্জক কিছু প্রকাশিত হয় নি। এখন আমি হতাশাগ্রস্ত হয়ে পড়ছিলাম। আমি এটি একটি সংকলিত সি # প্রোগ্রামে কাজ করেছি, তবে আমার ব্যবহারের জন্য আমি এটি একটি ইন্টারপেটেড ভাষায় চালিত করতে চেয়েছিলাম ... পাওয়ারশেল।

আমার সমাধানটি আমি খুঁজে পেয়েছি এবং এটি এখনও প্রমাণিত হচ্ছে তবে আমি আনন্দিত এবং এটি ভাগ করে নিতে চাই। আমি আগ্রহী এমন ফানকটি ব্যবহার করে একটি ছোট কনসোল.এক্সএইপি অ্যাপ্লিকেশন তৈরি করুন এবং তারপরে এটি এমন কোনও কিছুতে দেখুন যা এটির বিবর্তন করতে পারে বা আইএল কোডটি প্রদর্শন করবে। আমি রেড-গেটের প্রতিচ্ছবি এবং পাওয়ারশেল ভাষার জেনারেটর অ্যাড-ইন এবং ওয়ালাহ ব্যবহার করেছি! এটি সঠিক নির্মাণকারীর স্ট্রিংটি কী দেখিয়েছিল! :-) চেষ্টা করুন। এবং আমি আশা করি এটি এই সমস্যার মুখোমুখি যার পক্ষে কাজ করে for


2
এবং ... সঠিক নির্মাণকারী স্ট্রিং কি ছিল? এটি যেভাবে লেখা হয়েছে প্রশ্নের সত্যই উত্তর দেয় না। এছাড়াও, সার্ভারফল্টে আপনাকে স্বাগতম!
অস্টিনিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.