Даже не пытаясь усложнить задачу, вы можете просто выполнить оболочку 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
Это легко реализовать, проанализировать и не зависит от сторонних реализаций.
Вы можете использовать Fusion COM API. Цзюньфэн Чжан написал управляемую оболочку . Однако это с 2004 года, так что я не знаю, насколько хорошо он работает.
Хотите проверить GAC на предмет сборки или просто узнать, существует ли эта сборка на машине?
Если вам все равно, что сборка действительно находится в GAC , но просто загружаемый на компьютер (из домена приложения), вы можете просто использовать LoadAssembly с именем сборки (сильная, общая, полная и т. д.). Если сборка может быть загружена с помощью Fusion, она будет загружена, и тогда вы узнаете, что она существует.
Из .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");
Лучше использовать метод ReflectionOnlyLoad
. этот метод загружает сборку в контекст, предназначенный только для отражения, где ее можно изучить, но не выполнить.