Несколько коротких вопросов о сборках COM .net, regasm, dll, tlb и guids - PullRequest
2 голосов
/ 26 апреля 2019

Все вопросы связаны с dll проекта .net в .net framework 2.0, который представляет себя как COM.

1) Если мы не указываем GUID в исходном коде (typelib, классы, интерфейсы), кто генерирует GUID? Компилятор или регазм?

2) Значения GUID существуют в dll, в tlb или в обоих файлах?

3) Любой разработчик с одним и тем же исходным кодом будет генерировать одинаковые идентификаторы GUID независимо от компьютера, на котором он собирает или запускает regasm?

4) Если я запускаю regasm, пропуская существующие файлы dll и tlb, что произойдет, если dll и tlb не совпадают? Regasm регенерирует файл tlb с элементами обновления и идентификаторами GUID? Или он регистрирует TypeLib с текущим файлом tlb?

5) Какой смысл запускать regasm с установленными параметрами dll и tlb? Файл Tlb является частью того, что вы развертываете, или лучше всего развертывать только DLL и позволить regasm генерировать tlb на лету?

6) И последний вопрос, действительно ли требуется tlb? Какой смысл иметь файл tlb? Разве не вся информация уже есть в реестре? Какую дополнительную информацию он предоставляет?

7) Что нам нужно предоставить при отмене регистрации с помощью регазма? Длл? ТЛБ? И то и другое? Что происходит, если dll (или tlb) не совпадает с существующими записями reg? Если вы уже зарегистрированы с опцией tlb, но я запускаю regasm unregister только с dll, это также приведет к удалению записи TypeLyb?

8) Что касается битности, regasm всегда будет генерировать записи и под SysWow64? Регазм в Framework64 делает то же самое, что и в Framework?

1 Ответ

5 голосов
/ 26 апреля 2019

Библиотека типов является точным эквивалентом метаданных .NET. Это больше всего полезно для программиста клиента, это делает компилятор и IDE умными в отношении вашей библиотеки. Обеспечение автозаполнения и проверки синтаксиса, поэтому шансы несоответствия между его кодом и вашим минимальны. Шаг регистрации необходим, чтобы ваши файлы можно было найти обратно. Библиотека типов обычно внедряется как ресурс в саму DLL, например, метаданные .NET, но модель сборки .NET не делает это легким для выполнения. Компилятор клиента использует информацию библиотеки типов для генерации соответствующих вызовов COM. Руководства очень важны, потому что это то, что нужно использовать клиентскому компилятору, имена идентификаторов не играют никакой роли. Есть способ использовать «позднее связывание» с использованием имен, точного эквивалента Reflection в .NET, но это не включает библиотеку типов.

кто генерирует GUID?

CLR делает. Каждый интерфейс или класс .NET имеет один, независимо от того, является ли он [ComVisible (true)]. Выставляется также через свойство Type.GUID. Если вы не использовали атрибут [Guid] для типа, то он запускает алгоритм для генерации Guid, который использует объявление типа в качестве входных данных. Или, другими словами, если вы вносите какие-либо изменения в тип, тогда вы можете быть уверены, что Guid будет иметь другое значение. По этой причине вам никогда не следует использовать атрибут [Guid], если только вам не нужно создавать точную замену и не можете перекомпилировать клиентский код. TLBID происходит из файла AssemblyInfo.cs, который был сгенерирован автоматически при создании проекта.

в dll, в tlb или в обоих файлах?

Он существует в DLL только при использовании атрибута [Guid], но обычно он генерируется во время выполнения, как описано выше. Он всегда присутствует в библиотеке типов, поэтому клиентский компилятор знает, как создать объект вашего класса и использовать его интерфейс (ы).

будет генерировать те же самые GUID

Да, только объявление типа играет роль.

Если я запускаю regasm, пропуская существующие файлы dll и tlb

Regasm может только создать библиотеку типов, в соответствии с запросом с параметром / tlb, она не может взять существующую. В противном случае он делает то же самое, что и Tlbexp.exe, использует Reflection для перечисления типов в сборке, чтобы найти [ComVisible (true)] и генерировать соответствующее объявление библиотеки типов. Дополнительная вещь, которую он делает, - это запись ключа реестра для библиотеки типов в HKLM / Software / Classes / Typelib. Таким образом, клиентская среда может найти его обратно.

Какой смысл запускать regasm с установленными параметрами dll и tlb?

Никакая реальная идея с "параметром dll" может означать. Как отмечено выше, используйте / tlb для генерации библиотеки типов. Развертывание библиотеки типов зависит от ее использования. Если вы также не предоставляете клиентский код, вы всегда должны развертывать его, чтобы клиентский программист мог его использовать. Другое использование библиотеки типов - тема этого сообщения . Если вы не уверены, как клиентский программист будет использовать ваш код, всегда устанавливайте его.

Разве не вся информация уже есть в реестре?

То, что находится в реестре, ограничено, достаточно только информации, чтобы найти файл библиотеки типов. Описание ваших интерфейсов, их сигнатур методов, руководств и CLSID, которые необходимы фабричной функции, находится в библиотеке типов.

Что мы должны предоставить при отмене регистрации с помощью regasm?

Точно так же, как при регистрации, вы только добавляете / отменяете регистрацию.Вы также должны предоставить / tlb, если вы использовали его ранее, чтобы можно было удалить раздел реестра TypeLib.Может быть очень важно автоматизировать это, когда вы заняты разработкой и тестированием библиотеки, так как руководства обычно генерируются автоматически, и вы можете создать много мусора в реестре.Так же, как и уродливые царапины на голове, когда вы забыли запустить Regasm.Проект> Свойства> вкладка «Сборка», флажок «Зарегистрироваться для COM-взаимодействия».Но с другой стороны, что вам нужно запускать VS с повышенными правами, чтобы он мог писать в реестр.

regasm всегда будет генерировать записи и под SysWow64?

SysWow64 не играет никакой роливсегда избегайте развертывания в c: \ windows.Но да, разрядность имеет значение, реестр структурирован таким образом, что 64-разрядное приложение не может случайно создать объект в 32-разрядной библиотеке и умереть при ужасном исключении.И наоборот.32-битное клиентское приложение будет считывать ключи реестра из HKLM / Software / WOW6432Node, вы получите только ключи реестра, если вы использовали 32-битную версию Regasm.Возможно, следует отметить, что обычно хорошо запускать оба варианта Regasm, учитывая, что код C # может работать на любой платформе.

...