বেশিরভাগ লোকেরা এখন System.Reflection.Assembly.LoadWithPartialName
অবধি জানেন যে এটি হ্রাস করা হয়েছে, তবে দেখা যাচ্ছে যে এর Add-Type -AssemblyName Microsoft.VisualBasic
চেয়ে ভাল আচরণ করে নাLoadWithPartialName
:
আপনার সিস্টেমের প্রসঙ্গে আপনার অনুরোধটিকে বিশ্লেষণের জন্য কোনও প্রচেষ্টা করার পরিবর্তে [অ্যাড-টাইপ] "আংশিক নাম" "পুরো নাম" তে অনুবাদ করার জন্য একটি স্থিতিশীল, অভ্যন্তরীণ সারণীর দিকে তাকান।
যদি আপনার "আংশিক নাম" তাদের টেবিলে উপস্থিত না হয়, আপনার স্ক্রিপ্ট ব্যর্থ হবে।
আপনার কম্পিউটারে যদি সমাবেশের একাধিক সংস্করণ ইনস্টল থাকে তবে তাদের মধ্যে চয়ন করার মতো কোনও বুদ্ধিমান অ্যালগরিদম নেই। আপনি তাদের টেবিলে যেকোন একটির উপস্থিত হতে চলেছেন, সম্ভবত এটি পুরানো, পুরানো।
আপনি যে সংস্করণগুলি ইনস্টল করেছেন সেগুলি যদি টেবিলের অপ্রচলিত সংস্করণের চেয়ে সমস্ত নতুন হয় তবে আপনার স্ক্রিপ্টটি ব্যর্থ হবে।
অ্যাড-টাইপের কোনও "আংশিক নাম" এর মতো বুদ্ধিমান পার্সার নেই
.LoadWithPartialNames
।
মাইক্রোসফ্ট যা বলেছে আপনি আসলে করণীয় তা হ'ল:
Add-Type -AssemblyName 'Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
অথবা, আপনি যদি পথটি জানেন তবে এরকম কিছু:
Add-Type -Path 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualBasic\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualBasic.dll'
সমাবেশের জন্য প্রদত্ত সেই দীর্ঘ নামটি শক্তিশালী নাম হিসাবে পরিচিত , যা সংস্করণ এবং সমাবেশ উভয়েরইই অনন্য এবং এটি কখনও কখনও পুরো নাম হিসাবেও পরিচিত।
তবে এর ফলে কয়েকটি প্রশ্নের উত্তর দেওয়া যায় না:
প্রদত্ত আংশিক নাম দিয়ে আমার সিস্টেমে আসলে কী বোঝা যাচ্ছে তার শক্ত নামটি আমি কীভাবে নির্ধারণ করব?
[System.Reflection.Assembly]::LoadWithPartialName($TypeName).Location;
[System.Reflection.Assembly]::LoadWithPartialName($TypeName).FullName;
এগুলিও কাজ করা উচিত:
Add-Type -AssemblyName $TypeName -PassThru | Select-Object -ExpandProperty Assembly | Select-Object -ExpandProperty FullName -Unique
যদি আমি চাই যে আমার স্ক্রিপ্টটি সর্বদা একটি .dll এর একটি নির্দিষ্ট সংস্করণ ব্যবহার করে তবে আমি এটি কোথায় ইনস্টল করেছি তা সম্পর্কে নিশ্চিত হতে পারি না, আমি কীভাবে নির্ধারণ করব যে শক্তিশালী নামটি কী .dll থেকে আছে?
[System.Reflection.AssemblyName]::GetAssemblyName($Path).FullName;
বা:
Add-Type $Path -PassThru | Select-Object -ExpandProperty Assembly | Select-Object -ExpandProperty FullName -Unique
আমি যদি শক্ত নামটি জানি, তবে আমি কীভাবে। Dll পথ নির্ধারণ করব?
[Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a').Location;
এবং, অনুরূপ শিরাগুলিতে, আমি যদি ব্যবহার করছি তার প্রকারের নামটি যদি আমি জানি তবে কীভাবে আমি জানি যে এটি কী সমাবেশ থেকে আসছে?
[Reflection.Assembly]::GetAssembly([Type]).Location
[Reflection.Assembly]::GetAssembly([Type]).FullName
কীভাবে অ্যাসেম্বলিগুলি উপলব্ধ তা আমি কীভাবে দেখতে পারি?
আমি জিএসি পাওয়ারশেল মডিউলটির পরামর্শ দিই । Get-GacAssembly -Name 'Microsoft.SqlServer.Smo*' | Select Name, Version, FullName
বেশ ভাল কাজ করে।
- যে তালিকাটি
Add-Type
ব্যবহার করে তা কীভাবে দেখতে পাব ?
এটি কিছুটা জটিল। । নেট প্রতিফলক (পাওয়ারশেল কোর 6.0 এর জন্য নীচের আপডেটটি দেখুন) দিয়ে পাওয়ারশেলের যে কোনও সংস্করণে এটি কীভাবে অ্যাক্সেস করা যায় তা আমি বর্ণনা করতে পারি।
প্রথমে কোন পাঠাগারটি Add-Type
এসেছে তা নির্ধারণ করুন:
Get-Command -Name Add-Type | Select-Object -Property DLL
আপনার প্রতিফলক দিয়ে ফলাফল ডিএলএল খুলুন। আমি এটির জন্য আইএলএসপিএস ব্যবহার করেছি কারণ এটি ফ্লসস , তবে যে কোনও সি # প্রতিফলকের কাজ করা উচিত। সেই লাইব্রেরিটি খুলুন এবং দেখুন Microsoft.Powershell.Commands.Utility
। অধীনে Microsoft.Powershell.Commands
, সেখানে থাকা উচিত AddTypeCommand
।
এর জন্য কোড তালিকায় একটি ব্যক্তিগত শ্রেণি রয়েছে InitializeStrongNameDictionary()
,। এটি সেই অভিধানটি তালিকাভুক্ত করে যা শক্তিশালী নামগুলিতে সংক্ষিপ্ত নামদের মানচিত্র করে। আমি দেখেছি লাইব্রেরিতে প্রায় 750 টি এন্ট্রি রয়েছে।
আপডেট: এখন পাওয়ারশেল কোর 6.0 ওপেন সোর্স। এই সংস্করণটির জন্য, আপনি উপরের পদক্ষেপগুলি এড়িয়ে যেতে পারেন এবং সরাসরি তাদের গিটহাব সংগ্রহস্থলে সরাসরি অনলাইন কোডটি দেখতে পারেন । আমি গ্যারান্টি দিতে পারি না যে কোডটি পাওয়ারশেলের অন্য কোনও সংস্করণের সাথে মেলে।