2015-11-23 5 views
1

Когда я запускаю приведенный ниже сценарий из своего блока VS2013 C# PreBuildEvent, он блокирует исполняемый файл/сборку, чьи атрибуты я запрашиваю: «открыть дескриптор файла» - это ошибка, которую я получаю. Когда я запускаю его в интерактивном режиме, он работает нормально. Как я могу добавить инструкцию 'using' или иначе закрыть дескриптор файла? спасибо!Как я могу исправить свой сценарий Powershell, который читает атрибуты Assembly, но оставляет дескриптор открытого файла?

 
function Get-AssemblyProperty { 
param 
(
    $anExe  = "%temp%\my.exe", 

    [ValidateSet('System.Runtime.Versioning.TargetFrameworkAttribute', 
'System.Reflection.AssemblyFileVersionAttribute', 
'System.Reflection.AssemblyTitleAttribute', 
'System.Reflection.AssemblyDescriptionAttribute', 
'System.Reflection.AssemblyConfigurationAttribute', 
'System.Reflection.AssemblyCompanyAttribute', 
'System.Reflection.AssemblyProductAttribute', 
'System.Reflection.AssemblyCopyrightAttribute', 
'System.Reflection.AssemblyTrademarkAttribute', 
'System.Runtime.InteropServices.ComVisibleAttribute', 
'System.Runtime.InteropServices.GuidAttribute', 
'System.Diagnostics.DebuggableAttribute', 
'System.Runtime.CompilerServices.CompilationRelaxationsAttribute', 
'System.Runtime.CompilerServices.RuntimeCompatibilityAttribute')] 
    $anAttribute = "System.Reflection.AssemblyDescriptionAttribute" 

) 
    $thisFcn = "Get-AssemblyProperties" 
    $assembly = [Reflection.Assembly]::LoadFile($anexe) 

    $ary = $assembly.GetCustomAttributesData() 
    Write-Debug "$thisFcn : Array = $ary ." 

    $row = $ary | Where-Object { $_.AttributeType -like "$anAttribute" } 
    Write-Debug "$thisFcn : Matching Row = $row ." 
    # Matching Row = [System.Reflection.AssemblyDescriptionAttribute("Our application for Great Company")] 

    $ans = ($row -split '"')[1] # second 
    Write-Debug "$thisFcn : Answer = $ans ." 
    return $ans 
} 
+1

После того, как сборка загружена в домен приложения, ее нельзя выгрузить. Вам нужно выгрузить весь домен приложения, чтобы освободить его. –

+1

См. [Здесь] (http://stackoverflow.com/a/12807629/284111) для обходных решений. –

ответ

-2

Вы пытались «$ assembly.Dispose()»? Возможно, вы захотите прочитать this link

+0

Я постараюсь первым делом завтра! – AnneTheAgile

+0

Нет метода 'Dispose()' на объекте 'Assembly'. – Kev

 Смежные вопросы

  • Нет связанных вопросов^_^