Вот как я в итоге автоматизировал процесс регистрации и GAC-контроля моей dll.
Сначала я создал каталог в корневой папке решения под названием «ScriptedDevDellRegistration». Я скопировал самые последние версии gacutil.exe
и RegAsm.exe
(с соответствующими им файлами .config) в этот каталог.
Затем я добавил в этот каталог файл с именем RegDll.cmd
. Этот файл зарегистрирует dll со своим tlb, а затем установит его в GAC. Это полезно, когда требуется использовать сборку в среде разработки VB6 через COM-взаимодействие. Содержимое файла:
cd "%~dp0"
regasm MyDll.dll /tlb:MyDll.tlb /u
regasm MyDll.dll /tlb:MyDll.tlb
gacutil /u MyDll
gacutil /i MyDll.dll
Я также добавил файл с именем UnGacDll.cmd
, который удалит сборку из GAC. При запуске консольного тестового приложения, которое использует сборку в другом проекте и эта сборка была добавлена в GAC, у меня возникли проблемы с отладкой. Этот файл просто удаляет DLL из GAC, чтобы я мог легче отлаживать:
cd "%~dp0"
gacutil /u MyDll
Теперь, когда мои файлы настроены, мне нужно отредактировать события сборки моего проекта.
В свойствах проекта (я использую VS2010 с VB.NET) для компилируемой и зарегистрированной сборки / GAC'd, щелкните вкладку компиляции и нажмите кнопку «Build Events». В события после сборки добавьте код, подобный следующему:
IF not "$(ConfigurationName)" == "Release Scripted Dev Dll Registration" GoTo elseIf1
:default
COPY "$(TargetPath)" "$(SolutionDir)ScriptedDevDllRegistration\$(TargetFileName)"
"$(SolutionDir)ScriptedDevDllRegistration\RegDll.cmd"
GOTO exit
:elseIf1
IF not "$(ConfigurationName)" == "Debug ConsoleTest" GoTo elseIf2
"$(SolutionDir)ScriptedDevDllRegistration\UnGacDll.cmd"
GOTO exit
:elseIf2
IF not "$(ConfigurationName)" == "Debug Console Web Library" GoTo exit
"$(SolutionDir)ScriptedDevDllRegistration\UnGacDll.cmd"
GOTO exit
:exit
Сценарии cmd довольно уродливы, но очень полезны. Я использую различные конфигурации сборки, чтобы определить, какие сценарии выполняются в событиях после сборки. Например, первая строка ищет конфигурацию сборки с именем «Release Scripted Dev Dll Registration», которая копирует DLL в созданный мной подкаталог, а затем выполняет RegDll.cmd
для регистрации сборки и ее библиотек типов, а также GAC сборки.
Другие конфигурации, «Debug ConsoleTest» и «Debug Console Web Library», работают лучше всего, когда dll отсутствует в GAC, поэтому событие после сборки вызывает UnGacDll.cmd
для этих конфигураций.
Я уверен, что можно написать некоторые из этих функций без физического копирования утилит dll или regasm.exe или gacutil.exe, но решение, которое я объяснил выше, хорошо сработало для меня.