Сбой при получении Powershell GetCustomAttributes не удалось загрузить файл или сборку - PullRequest
0 голосов
/ 22 января 2020

Сценарий ps1 должен l oop просмотреть сборки в папке / bin, извлечь атрибуты и затем создать файл json со совпадениями. Это все работает для 99% DLLS.

Но одна DLL была построена со ссылкой на старую сборку

Exception calling "GetCustomAttributes" with "1" argument(s): "Could not load file or assembly
'Telerik.Sitefinity.Frontend, Version=12.2.7200.0, Culture=neutral, PublicKeyToken=b28c218413bdf563' or one of its
dependencies. The system cannot find the file specified."

Версия в папке 12.2.7225.0

Так эта сборка в основном пропускается ...

Это не проблема, когда веб-приложение запускается, потому что привязка сборки web.config просто прекрасно обрабатывает несоответствие версий, но в powershell это танкование.

param(
    [Parameter(Mandatory=$true)]
    [string]$binariesDirectory
)

$assemblies = Get-ChildItem $binariesDirectory -Filter *.dll
$controllerAssemblies = @()

foreach ($assembly in $assemblies) {
    $loadedAssembly = [System.Reflection.Assembly]::LoadFrom($assembly.FullName)

    #THIS IS THE TEST 
    if($assembly.Name -eq "RandomSiteControlsMVC.dll"){
        Write-Output "Custom Attributes for " + $assembly.Name;
        #THIS IS WHAT FAILS
        $result = [reflection.customattributedata]::GetCustomAttributes($loadedAssembly)
        Write-Output $result;
    }

    #$loadedAssembly.CustomAttributes just returns nothing in the case of that DLL
    if ($loadedAssembly.CustomAttributes | ? { $_.AttributeType.FullName -eq "Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes.ControllerContainerAttribute" -or $_.AttributeType.FullName -eq "Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes.ResourcePackageAttribute"}) {
        $controllerAssemblies += $assembly.Name
    }
}

$controllerAssemblies | ConvertTo-Json -depth 100 | Set-Content "$binariesDirectory\ControllerContainerAsembliesLocation.json" -Force

Есть ли какой-нибудь волшебный способ, которым это могло бы просто сработать без того исключения?

1 Ответ

1 голос
/ 22 января 2020

Используйте оператор Try Catch для обнаружения ошибки. Затем в операторе catch вы можете выполнить действие, если dll не сможет войти в систему или ... просто ничего.

Например, в вашем случае, так как вы находитесь в al oop, вы можете добавить оператор Continue, если имя сборки не имеет значения, или выбросить обратно ошибка, если это другая DLL. Как то так:

try {
    $loadedAssembly = [System.Reflection.Assembly]::LoadFrom('blurb.dll') 
}
catch {
    # Update accordingly to your needs
    if ($assembly.Name -eq "Telerik.Sitefinity.Frontend.dll") {
        # Let's stop there and go to the next dll in the loop
        Continue 
    }
    else {
        # Do something if the dll that failed to load is another dll than the one you don't care
        Write-Error $_ 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...