Voici une petite fonction que vous pourriez vouloir essayer .. (je ne l'ai pas encore testé, car je ne dispose pas de critères pour tester cela avec facilement ..)
Il peut être utilisé en fournissant les chemins (un ou plusieurs chemins complets ou relatifs séparés par des virgules) sur la ligne de commande de ce type
CheckForAbstractClassInheritance -Abstract System.Object -Assembly c:\assemblies\assemblytotest.dll, assemblytotest2.dll
ou de la canalisation
'c:\assemblies\assemblytotest.dll','assemblytotest2.dll' | CheckForAbstractClassInheritance -Abstract System.Object
ou avec des objets Fileinfo de Get-Childitem (dir)
dir c:\assemblies *.dll | CheckForAbstractClassInheritance -Abstract System.Object
Tweak au besoin ..
function CheckForAbstractClassInheritance()
{
param ([string]$AbstractClassName, [string[]]$AssemblyPath = $null)
BEGIN
{
if ($AssemblyPath -ne $null)
{
$AssemblyPath | Load-AssemblyForReflection
}
}
PROCESS
{
if ($_ -ne $null)
{
if ($_ -is [FileInfo])
{
$path = $_.fullname
}
else
{
$path = (resolve-path $_).path
}
$types = ([system.reflection.assembly]::ReflectionOnlyLoadFrom($path)).GetTypes()
foreach ($type in $types)
{
if ($type.IsSubClassOf($AbstractClassName))
{
#If the type is a subclass of the requested type,
#write it to the pipeline
$type
}
}
}
}
}
Le seul problème ici est que vous ne pouvez pas instancier des classes ou exécuter des méthodes d'assemblées qui ont été chargés de la réflexion que. – x0n