Powershell oturumuna .NET derlemeleri nasıl düzgün şekilde eklenir?


24

Burada kullandığımız yazılımı yedeklemek için bir API olan bir .NET derlemesine (bir dll) sahibim. Powershell betiğim (ler )imde yararlanmak istediğim bazı özellikler ve yöntemler içeriyor. Bununla birlikte, ilk önce montajı yüklerken, ardından montaj yüklendikten sonra herhangi bir tip kullandığımda birçok sorunla karşılaşıyorum.

Tam dosya yolu:

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

Powershell'de kullanıyorum:

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

Aşağıdaki hatayı alıyorum:

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.

Aynı cmdlet'i başka bir .NET derlemesinde kullanmak, sitede aynı işlevi kullanmak için örneklere sahip olan DotNetZip de benim için çalışmıyor.

Sonunda yansıma kullanarak derleme yüklemek mümkün görünmektedir:

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

Her ne kadar Load, LoadFrom veya LoadFile yöntemleri arasındaki farkı anlamadım, ancak bu son yöntem çalışıyor gibi görünüyor.

Ancak, hala örnekler oluşturamıyor veya nesneler kullanamıyor gibi görünüyor. Her denediğimde, Powershell'in herkese açık türlerden hiçbirini bulamadığını açıklayan hatalar alıyorum.

Sınıfların orada olduğunu biliyorum:

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

---- alıntı başlangıcı ----

   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)

---- alıntıların sonu ----

Statik yöntemleri kullanmaya çalışmak başarısız, nedenini bilmiyorum !!!

[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

Herhangi bir rehberlik takdir !!

Yanıtlar:


15

Bir Add-Typehata yakalamayı deneyerek etrafınızı doyurup LoaderExceptions özelliğini yazdırabilir misiniz? Daha ayrıntılı bir hata mesajı ile istisna sağlayabilir.

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

9
Bu benim için işe yaramadı, ama beni basketbol sahası içine aldı. Yakalama içinde LoaderExceptions nesnesi burada bulunur: $ _. Exception.LoaderExceptions
Brett

göreceli yolu kullanmanın bir yolu yok mu?
Amit

3

Bu bağlantıyı buldum: http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassembly-in.html

".LoadWithPartialName" ifadesinin kullanımdan kaldırıldığını söyledi. Bu nedenle, Add-Type'ı bu yöntemle uygulamaya devam etmek yerine, "kısmi adı" "tam adı" olarak çevirmek için statik, iç tablo kullanır. Soruda verilen örnekte CloudBerry.Backup.API.dll, PowerShell'in iç tablosunda bir giriş yoktur, bu yüzden [System.Reflection.Assembly]::LoadFrom($dllpath)işe yarar. Kısmi bir isim aramak için tabloyu kullanmıyor.


2

Yukarıdaki yöntemlerden bazıları benim için işe yaramadı ya da belirsizdi.

İşte -AddPath çağrılarını sarmalamak ve LoaderExceptions yakalamak için kullandığım şey:

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)"
}

Referans
https://social.technet.microsoft.com/Forums/sharepoint/en-US/dff8487f-69af-4b64-ab83-13d58a55c523/addtype-inheritance-loaderexceptions


0

Powershell'de özel bir csharp kontrolü yüklemek için aşağıdaki kurulumu kullandım. Kontrolün powershell içinden kişiselleştirilmesine ve kullanılmasına izin verir.

İşte blog linki

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

ve burada kaynak kodlu proje bağlantısı

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


3
Sunucu Arızasına Hoşgeldiniz! Yanıtların, içeriğe işaretçiler değil, içerik içermesini gerçekten tercih ediyoruz. Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.
jscott

0

LoaderExceptionsHata kayıt içinde gizlidir. Eklenti hatası, hata listesindeki en son hata ise $Error[0].InnerException.LoaderExceptions, hataları göstermek için kullanın . Büyük olasılıkla, kütüphaneniz yüklenmemiş bir başkasına bağlıdır. Ya edebilirsiniz Add-Typeher biri, ya da sadece bir listesini yapmak ve kullanmak -ReferencedAssembliesiçin argüman Add-Type.


$ Error [0] .Exception.LoaderExceptions ve Eris'in tavsiyelerine uyarak deneyin.
Tahir Hassan

-1

Şimdiye kadar tahmin OLABİLİR Bu fenomen bir yanıt bulduk. Aynı görevle karşılaştıktan sonra bu yazıya koştum ... Derlemeyi yükleyebilir ve derlemede yer alan türleri görüntüleyebilirdim, ancak bir örneğini statik bir sınıftan anlayamadım. EFTIDY miydi? Düzenli, EFTidyNet.TidyNet.Options ya da ne? Ooooo Weeee ... Problemler ... problemler ... her şey olabilir. Ve statik yöntemleri ve DLL türlerini bakarak umut verici bir şey ortaya koymadı. Şimdi depresyona giriyordum. Derlenmiş bir C # programında çalışmasını sağladım, fakat benim kullanımım için enterpetlenmiş bir dilde çalışmasını istedim ... powershell.

Çözümüm buldum ve hala kanıtlanıyor, ancak mutluyum ve bunu paylaşmak istedim. İlgilendiğim func'u kullanan küçük bir konsol.exe uygulaması oluşturun ve sonra onu koda ya da IL kodunu gösterecek bir şeyde görüntüleyin. Red-Gate'in reflektörünü ve powershell dil üreteci eklentisini ve Wallah'ı kullandım! uygun kurucu dizenin ne olduğunu gösterdi! :-) Dene. ve umarım bu sorunla kim karşı karşıya kalırsa işe yarar.


2
Ve ... uygun kurucu ipi neydi? Bu soruya yazıldığı gibi cevap vermiyor. Ayrıca, ServerFault'a hoş geldiniz!
Avustralya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.