какая версия DLL-файлов загружается Powershell? - PullRequest
0 голосов
/ 16 октября 2018

Когда я запускаю PowerShell ISE в Windows 10, я могу запустить следующий код

$dt = new-object "system.data.DataTable";

Я знаю, что это возможно только потому, что загружен файл System.Data.dll, в противном случае возникнет ошибка DataTable класс из System.Data.dll

На моем компьютере установлено несколько версий .Net Framework, таких как v4.6.x, v4.7.x

Итак, мой вопрос: когда мой PowerShell запускается

  1. как узнать, какие загружаемые файлы DLL?
  2. какие у них версии?

Заранее спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Если вы заботитесь только о загруженных в данный момент сборках, вы можете использовать

[System.AppDomain]::CurrentDomain.GetAssemblies()
GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.PowerSh
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_

Если вы заботитесь о ссылочных сборках, это усложняется.

$loaded = [System.AppDomain]::CurrentDomain.GetAssemblies()
$referenced = $loaded.GetReferencedAssemblies() | select-object -Unique

Это позволит получить все загруженные сборки и всессылочные сборки.Проблема в том, что указанные сборки не все загружены, поэтому вы получаете только объект AssemblyName.

$referenced
Version        Name
-------        ----
4.0.0.0        mscorlib
4.0.0.0        System
3.0.0.0        System.Management.Automation
4.0.0.0        System.Core
4.0.0.0        System.Xml
4.0.0.0        System.Configuration

Чтобы получить остальные детали, вы можете использовать отражение.

$referenced = $loaded.GetReferencedAssemblies() | select-object -Unique | ForEach-Object {
    [System.Reflection.Assembly]::ReflectionOnlyLoad($_)
}
$referenced
GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configurat
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Security\v
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.DirectoryS

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

$referenced = $loaded.GetReferencedAssemblies() | select-object -Unique | `
    ForEach-Object {
        [System.Reflection.Assembly]::ReflectionOnlyLoad($_)
    } | Where-Object {
            $loaded.FullName -notcontains $_.FullName
    }

Теперь в списке ссылок есть только ссылки, которые не загружены.

$referenced
GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_64\Microsoft.Manag
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.JSc
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Servic
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Web.Re
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Design
True   v4.0.30319     C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Bui

Обратите внимание, что на них могут ссылаться сборки, которые также не загружены.Так что вам нужно будет создать рекурсивную функцию для их повторения, повторяя описанные выше методы, если вы хотите копать так глубоко.

0 голосов
/ 16 октября 2018

Используйте следующую команду, показанную с примером вывода с моего компьютера с Windows 10, на котором работает PowerShell v5.1:

PS> (Get-Item ([System.Data.DataTable].Assembly.Location)).VersionInfo | Format-List    

OriginalFilename  : system.data.dll
FileDescription   : .NET Framework
ProductName       : Microsoft® .NET Framework
Comments          : Flavor=Retail
CompanyName       : Microsoft Corporation
FileName          : C:\WINDOWS\Microsoft.Net\assembly\GAC_64\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll
FileVersion       : 4.7.3160.0 built by: NET472REL1LAST_C
ProductVersion    : 4.7.3160.0
IsDebug           : False
IsPatched         : False
IsPreRelease      : False
IsPrivateBuild    : True
IsSpecialBuild    : False
Language          : English (United States)
LegalCopyright    : © Microsoft Corporation.  All rights reserved.
LegalTrademarks   :
PrivateBuild      : DDBLD202B
SpecialBuild      :
FileVersionRaw    : 4.7.3160.0
ProductVersionRaw : 4.0.30319.0
  • [System.Data.DataTable] - это литерал типа (объект, представляющийтип, полное имя которого задано)

  • .Assembly возвращает объект, представляющий сборку, содержащую тип.

  • .Location возвращает этоПуть к файлу сборки.

  • При передаче этого пути к файлу Get-Item выводится [System.IO.FileInfo] объект, представляющий файл сборки.

  • То [System.IO.FileInfo] У объекта есть свойство .VersionInfo, возвращающее сведения о версии.

  • В трубопроводе к Format-List отображаются сведения о версии в виде списка, причем каждое свойство печатается в отдельной строке..

Обратите внимание, что существует два номера версий :

  • CLR (общеязыковая версия) номер версии , как отражено в Version.ProductVersionRaw (4.0.30319.0) (но, по-видимому, также косвенно в путь к файлу , v4.0_4.0.0.0__b77a5c561934e089)

  • Framework номер версии , как указано в VersionInfo.ProductVersion (4.7.3160.0)

Как правило, несколько успешных framework версии построены на той же версии CLR ;например, обе платформы v4.6.x и v4.7.x построены на CLR v4.x.

Обратите внимание, что не все типы System.* обязательно сообщают одну и ту же версию framework , но версия CLR , о которой они сообщают, по определению та же самая.


Используйте следующее для извлечения только номера версии framework , как [version]объект, непосредственно получая доступ к свойству ProductVersion version-info:

[version] (Get-Item ([System.Data.DataTable].Assembly.Location)).VersionInfo.ProductVersion

Это дает, например:

Major  Minor  Build  Revision
-----  -----  -----  --------
4      7      3160   0       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...