Как программно проверить GAC на сборку?
Проверьте GAC для сборки
Ответы (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
Это легко реализовать и проанализировать, и оно не зависит от каких-либо сторонних реализаций.
gacutil.exe
и захват вывода - это мое определение чрезмерно сложного, я предпочитаю, чтобы все было как можно проще :) Если это между использованием gacutil и Fusion API, то это может быть спорным. См. мой ответ здесь: stackoverflow.com/a/19459379/1004119.
- person Scott Lerch; 19.10.2013
Лучше использовать метод ReflectionOnlyLoad
. этот метод загружает сборку в контекст только для отражения, где ее можно просмотреть, но не выполнить.
Из .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");
Вы можете использовать Fusion COM API. Цзюньфэн Чжан написал управляемую оболочку. Однако он с 2004 года, поэтому я не знаю, насколько хорошо он работает.
Вы хотите проверить GAC на наличие сборки или просто хотите знать, что сборка существует на машине?
Если вам все равно, что сборка на самом деле находится в GAC, а просто загружается на машину (из домена приложения), вы можете просто использовать LoadAssembly с именем сборки (сильная, общая, полная и т. д.). Если сборка может быть загружена Fusion, она будет загружена, и тогда вы узнаете, что она существует.