2015-12-10 5 views
0

Я унаследовал приложение, использующее Microsoft Enterprise Library. VS-решение приложений содержит около 200 проектов.Как узнать, какое приложение требует определенной сборки от GAC?

Я реструктурировал решение, перемещая проекты и удаляя устаревшие. Мне нужно привести его в порядок, чтобы он был готов для других разработчиков.

Решение содержит DLL-файлы Microsoft Enterprise Library определенной версии, однако, когда я перемещал файлы, я заметил, что некоторые проекты не ссылаются на эти dll, а вместо dll с моего GAC.

Мне нужно убедиться, что это решение не зависит ни от чего другого (в GAC или от другого) или от документа, если это так, так что следующий человек не испытывает неприятного удивления, когда вытаскивает его из источника.

Я попытался удалить DLL Enterprise Library из GAC. Это не удалось, как это:

C:\WINDOWS\system32>gacutil /u Microsoft.Practices.EnterpriseLibrary.Common 
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.0 
Copyright (c) Microsoft Corporation. All rights reserved. 


Assembly: Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=e44a2bc38ed2c13c, processorArchitecture=MSIL 
Unable to uninstall: assembly is required by one or more applications 
Pending references: 
       SCHEME: <WINDOWS_INSTALLER> ID: <MSI> DESCRIPTION : <Windows Installer> 
Number of assemblies uninstalled = 0 
Number of failures = 0 

Это сообщение заставляет меня думать, что эта длл ссылается приложение, установленное с установщика Windows (MSI).

В моей машине нет Microsoft Enterprise Library в качестве одного из элементов панели управления/программ и функций.

Как узнать, какой продукт, установленный в MSI, установил DLL в gac?

EDIT: не обман. Другой вопрос задает вопрос о ситуации, когда сборка не показана в GAC проводником процесса, а KB говорит о ситуации, когда сборку нельзя удалить, даже если на нее нет ссылки. Проводник процесса этого другого вопроса не имеет отношения ко мне, так как я не ожидаю, что сборка будет загружаться все время. Ответ kb также не помогает, так как я не хочу удалить сборка. Я хочу узнать, какая программа установлена. Ответ на другой вопрос не отвечает на это (потому что это не то, что там задавали), но, к счастью, я получил ответы на качество здесь.

+0

Возьмите прочитанный на этом https://support.microsoft.com/en-us/kb/873195 –

+0

Возможный дубликат [Невозможно удалить сборку из GAC?] (HTTP : //stackoverflow.com/questions/2447306/unable-to-uninstall-an-assembly-from-gac) –

ответ

2

Быстрый и грязный способ, который всегда работал для меня, чтобы открыть CMD строке, перейдите в C: \ Windows \ Installer и сделать Findstr:

Findstr/s -i -m AssemblyName.dll *. msi

Если вы нашли какие-то хиты, вы получите один или несколько файлов с коротким хэшированным именем, заканчивающимся на .msi. Используйте редактор базы данных установщика Windows «ORCA» (установите платформу SDK или Google ORCA.msi), чтобы изучить каждую из этих баз данных и посмотреть, в каком из них есть компонент, который устанавливает указанный файл в каталог GlobalAssemblyCache. Если сборка присутствует в таблице MsiAssembly, а поле File_Application пуст, то она устанавливается в GAC. Как только вы его найдете, просмотрите таблицу свойств и сводный информационный поток (верхнее меню -> Вид -> сводная информация), чтобы определить, какой продукт представляет собой кэшированный MSI.

+0

Звучит как план, спасибо. Я попробую (завтра) и вернусь к вам! Еще раз спасибо! –

0

Здесь есть несколько вещей, чтобы понять. Во-первых, GAC будет предпочтительным местом для получения сборки. Итак, на вашей машине dev удалите EL сборки из GAC. Добавьте EL из пакета Nuget в свой проект. Ассембли в GAC могут быть добавлены вручную. Не обязательно использовать MSI. Если вы хотите, чтобы ваш проект игнорировал другие версии, например, в GAC. В ссылках в вашем проекте выберите соответствующую ссылку и установите «Специфическая версия» на true. Теперь ваш проект больше не будет заменять исходную ссылку одной из GAC, если версия не соответствует. На этом этапе вы можете добавить свой EL этой версии в корзину или все, что у вас там есть.

Для такого большого решения мое предложение создать следующую структуру

- Solution 
    - packages(nuget) 
    - bin 
    - Project 1 
    - . . . . . 
    - Project N 
  • Удалить все ссылки на проекты и заменить их ссылками на библиотеки DLL в bin.
  • Задайте свои проекты, чтобы построить выход до bin.
  • Создать заказ на строительство.
  • Удалите любые ваши DLL-файлы из GAC, удалите любые сторонние DLL-файлы из GAC и поместите их в bin.Только DLL, которые начинаются с «системы», могут быть в GAC или «Project Files» и т. Д. Любые другие должны быть итераторами в packages или bin. (Хотя в некоторых случаях полезно, чтобы захватить те из packages и перейти к bin)
  • В ваших ссылках проекта установить любые не системные библиотеки для copy local = true, и, как правило/обычно все должны иметь specific version = false

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

2

Я использую сценарий, чтобы перечислять все компоненты в системе, их направляющие, где они установлены, и код и имя продукта-владельца. Это может занять некоторое время.

Option Explicit 
 
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce 
 

 
Set fso = CreateObject("Scripting.FileSystemObject") 
 
Set a = fso.CreateTextFile("comps.txt", True) 
 

 
' Connect to Windows Installer object 
 
Set installer = CreateObject("WindowsInstaller.Installer") 
 
a.writeline ("MSI Components") 
 
on error resume next 
 
For Each comp In installer.components 
 
    a.writeline (comp & " is used by the product:") 
 
    for each prod in Installer.ComponentClients (comp) 
 
     pid = installer.componentpath (prod, comp) 
 
     pname = installer.productinfo (prod, "InstalledProductName") 
 
     a.Writeline ("  " & pname & " " & prod & "and is installed at " & pid) 
 
    Next 
 
Next

+0

Это способ API, но я считаю, что подход findstr работает быстрее и легче запомнить, когда это необходимо на лету. –

+0

@ChristopherPainter зависит от количества файлов msi. Если вы получите 10 хитов, этот подход будет быстрее, чем ваш, потому что вам не нужно открывать каждый из мши в orca индивидуально. –

+0

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

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

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