Как программно зарегистрировать (установить правильный путь) библиотеку типов из .NET?

Используя .NET 4.0, я создал библиотеку DLL с поддержкой COM (назовем ее example.dll), зарегистрировал ее и сгенерировал соответствующую библиотеку типов с помощью regasm.exe (regasm.exe / tlb / codebase example.dll); библиотека типов называется example.tlb. Сборка строго названа.

Пока это работает, и я могу использовать DLL и TLB из VBA.

Но по определенным причинам мне нужно сделать свою собственную утилиту, которая выполняет регистрацию DLL и генерацию TLB. По сути, эта утилита будет находиться в том же каталоге, что и DLL, и должна зарегистрировать DLL, которую она найдет в этом каталоге, а также сгенерировать файл TLB из DLL, которую она найдет в этом каталоге.

Регистрация DLL и генерация TLB, похоже, работают, но есть следующая проблема: я не нашел никаких приемлемых средств для установки правильного пути к файлу TLB из .NET 4.0, и именно в этот момент я был бы очень признателен за любые Помогите.

Чтобы воспроизвести и проиллюстрировать, представьте следующую ситуацию:

У меня есть c: \ test_1 \ example.dll, измените каталог на c: \ test_1 и запустите regasm.exe / tlb / codebase example.dll. Это, по крайней мере, так, как я понял: он регистрирует DLL, создает TLB (c: \ test_1 \ example.tlb) и каким-то образом регистрирует сам TLB (см. Ниже, что я имею в виду под этим).

Теперь я перемещаю DLL в c: \ test_2, помещаю мою регистрацию и утилиту генерации TLB в c: \ test_2, меняю каталог в c: \ test_2 и запускаю мою утилиту. По-видимому, DLL регистрируется правильно, и создается TLB. Но TLB незарегистрированный (увидеть ниже).

Мой вопрос сейчас заключается в том, как я могу зарегистрировать TLB из .NET.

Регистрируя TLB, я имею в виду следующее: при использовании regasm.exe, как показано выше, он явно помещает путь к TLB в реестр (по крайней мере, я нашел его там). Когда вы используете oleview.exe для просмотра соответствующей библиотеки типов, он показывает этот путь. Когда я использую свою собственную утилиту для регистрации и генерации TLB, этот путь не обновляется - путь всегда тот, который был установлен при последнем запуске regasm.exe.

Это приводит к тому, что TLB не может быть найден, например, Excel после перемещения DLL и моей утилиты в другой каталог и запуска утилиты.

Это соответствующая часть исходного кода утилит (VB.net, обработка ошибок и пользовательский интерфейс удалены):

sub Register()

  Dim s_Path As String
  Dim asm_DLL As [Assembly]
  Dim rs_DLL As RegistrationServices
  Dim tlc_DLL As TypeLibConverter
  Dim ns_DLL As cls_TLBCreatorNotifySink
  Dim tlb_DLL As UCOMICreateITypeLib

  s_Path = Application.StartupPath & "\example.dll"

  asm_DLL = Assembly.LoadFrom(s_Path)

  rs_DLL = New RegistrationServices()
  rs_DLL.RegisterAssembly(asm_DLL, AssemblyRegistrationFlags.SetCodeBase)

  s_Path = Application.StartupPath & "\example.tlb"
  ns_DLL = New cls_TLBCreatorNotifySink
  tlc_DLL = New TypeLibConverter
  tlb_DLL = CType(tlc_DLL.ConvertAssemblyToTypeLib(asm_DLL, s_Path, TypeLibExporterFlags.None, ns_DLL), UCOMICreateITypeLib)
  tlb_DLL.SaveAllChanges()

end sub


Public Class cls_TLBCreatorNotifySink

  Implements ITypeLibExporterNotifySink

  Public Sub ReportEvent(eventKind As System.Runtime.InteropServices.ExporterEventKind, eventCode As Integer, eventMsg As String) Implements System.Runtime.InteropServices.ITypeLibExporterNotifySink.ReportEvent

  End Sub

  Public Function ResolveRef(assembly As System.Reflection.Assembly) As Object Implements System.Runtime.InteropServices.ITypeLibExporterNotifySink.ResolveRef

    Return Nothing

  End Function

End Class

Я надеюсь, что смог выразить проблему достаточно четко. Мой вопрос сводится к тому, существует ли разумный метод в .NET, который позволяет мне устанавливать путь к TLB в реестре, или если мне приходится напрямую манипулировать соответствующими записями в реестре (что было бы глупо, потому что никто не знает, если в следующей версии Windows используются те же записи); бонус будет знать, как это делает regasm.exe.

Ответы на вопрос(1)

Ваш ответ на вопрос