Хороший способ написать сценарий regasm и gacutil для COM Interop DLL на компьютере разработчика - PullRequest
2 голосов
/ 06 июля 2010

Я работаю над библиотекой .NET, которая предназначена для использования в проекте VB6.Чтобы настроить dll для использования на моем компьютере разработчика, Я использую regasm и gacutil, например:

regasm /tlb:MyDll.tlb Mydll.dll 

gacutil /i Mydll.dll 

При каждом последующем вызове я также отменяю регистрациюудалить сборку:

regasm /u /tlb:MyDll.tlb Mydll.dll
regasm /tlb:MyDll.tlb Mydll.dll 

gacutil /u Mydll
gacutil /i Mydll.dll 

В настоящее время я делаю это из командной строки Visual Studio Tools.Есть ли способ записать эти команды в один путь выполнения?

ПРИМЕЧАНИЕ. Этот сценарий предназначен только для моей машины разработчика где regasm и gacutil легко доступны.

1 Ответ

1 голос
/ 13 июля 2010

Вот как я в итоге автоматизировал процесс регистрации и 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, но решение, которое я объяснил выше, хорошо сработало для меня.

...