Проверьте GAC для сборки

Как программно проверить GAC на сборку?


person Jessy    schedule 19.12.2009    source источник
comment
Очень тесно связано: stackoverflow.com/questions/3356207/   -  person sɐunıɔןɐqɐp    schedule 21.01.2021
comment
А также: stackoverflow.com/questions/19456547/   -  person sɐunıɔןɐqɐp    schedule 21.01.2021


Ответы (5)


Даже не пытаясь усложнять, вы можете просто раскошелиться на gacutil и зафиксировать вывод. Например, gacutil /l Microsoft.Practices.Unity дает мне:

Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

The Global Assembly Cache contains the following assemblies:
  Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31
bf3856ad364e35, processorArchitecture=MSIL

Number of items = 1

против gacutil /l Some.Nonexistant.Assembly:

Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

The Global Assembly Cache contains the following assemblies:

Number of items = 0

Это легко реализовать и проанализировать, и оно не зависит от каких-либо сторонних реализаций.

person jason    schedule 19.12.2009
comment
Оболочка gacutil.exe и захват вывода - это мое определение чрезмерно сложного, я предпочитаю, чтобы все было как можно проще :) Если это между использованием gacutil и Fusion API, то это может быть спорным. См. мой ответ здесь: stackoverflow.com/a/19459379/1004119. - person Scott Lerch; 19.10.2013
comment
Вы не можете рассчитывать на то, что gacutil будет доступен во всех средах — это инструмент Visual Studio, и он недоступен при обычной установке среды выполнения .NET. docs.microsoft.com/en-us/ dotnet/framework/tools/ - person Josh; 23.04.2018
comment
Вы не можете распространять gacutil.exe . Это против лицензии. - person joe; 19.08.2020

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

person BALKANGraph    schedule 29.04.2010

Из .NET API отражения — Assembly.Load(...) выдаст FileNotFoundException, если не найдет сборку. Для API требуется полное имя сборки, поэтому я предполагаю, что оно должно быть в GAC. Я использую его для проверки наличия SQL Server Compact Edition:

Assembly foo = Assembly.Load("System.Data.SqlServerCe, Version=3.5.1.0, " +
    "Culture=neutral, PublicKeyToken=89845dcd8080cc91");
person StrayPointer    schedule 31.12.2009
comment
Assembly.Load выполняет поиск и в других местах: контекст загрузки по умолчанию содержит сборки, найденные путем проверки глобального кэша сборок, хранилища хост-сборок, если среда выполнения размещена (например, в SQL Server), а также ApplicationBase и PrivateBinPath домена приложения. . - msdn.microsoft.com/cs-cz/library/dd153782.aspx - person Bohdan; 08.10.2011

Вы можете использовать Fusion COM API. Цзюньфэн Чжан написал управляемую оболочку. Однако он с 2004 года, поэтому я не знаю, насколько хорошо он работает.

person David Brown    schedule 19.12.2009
comment
Использование API-интерфейса Fusion на основе COM является правильным способом, но попытка выполнить Assembly.Load и перехват FileNotFoundException намного проще. - person Mike Post; 21.02.2010
comment
@Mike Post: Но у него также есть неприятный побочный эффект загрузки сборки в домен приложения, что на самом деле не то, что здесь нужно. Простота использования не всегда превосходит правильность (я бы сказал, что редко). - person casperOne; 30.05.2011
comment
ReflectionOnlyLoad имеет тот же побочный эффект загрузки сборки в домен приложения. Читайте мелкий шрифт в документах. Это просто другой обходной путь для использования сложного неуправляемого COM Fusion API. - person Mike Post; 02.06.2011

Вы хотите проверить GAC на наличие сборки или просто хотите знать, что сборка существует на машине?

Если вам все равно, что сборка на самом деле находится в GAC, а просто загружается на машину (из домена приложения), вы можете просто использовать LoadAssembly с именем сборки (сильная, общая, полная и т. д.). Если сборка может быть загружена Fusion, она будет загружена, и тогда вы узнаете, что она существует.

person GrayWizardx    schedule 19.12.2009