Как программа COM находит.NET DLL, зарегистрированную для взаимодействия COM?

Один клиент хочет использовать наши.NET DLL из VB6. Они предназначены для поддержки обратного взаимодействия, и все работает нормально... за исключением: есть две отдельные программы VB6 в двух разных каталогах. Кажется, необходимо сделать одно из:

  1. Скопируйте.NET DLL в обе директории, или
  2. Установите.NET DLL в GAC

Это наблюдение клиента, которое также подтверждается документацией RegAsm:

После регистрации сборки с помощью Regasm.exe вы можете установить ее в глобальном кэше сборок, чтобы ее можно было активировать с любого COM-клиента. Если сборка будет активирована только одним приложением, вы можете поместить ее в каталог этого приложения.

Я запутался в этом вопросе.

Первая точка путаницы:

Насколько я понимаю, среда выполнения COM находит DLL с помощью идентификатора программы / идентификатора класса. Когда я просматриваю в реестре запись Class ID, я вижу полный путь к.NET DLL в ключе CodeBase. Почему COM-программа, использующая Prog ID / Class ID, не находит.NET DLL с помощью CodeBase?

Второй момент путаницы:

GAC специфичен для.NET. Как это связано с разрешением COM-ссылок?

1 ответ

Решение

Вы правы, COM использует ProgId, чтобы добраться до ClassId, чтобы добраться до COM-сервера для загрузки. В случае COM-библиотек.NET COM-сервер на самом деле является MSCOREE, а не.NET-библиотекой (значение ключа по умолчанию в {CLSID}/localserver32). MSCOREE, а не COM, может использовать любые правила, которые он хочет найти для сборки.NET.

На данный момент я не знаю, что на самом деле делает.NET - это потребует тестирования. Вы можете наблюдать за собой, используя FUSLOGVW. Однако я могу догадаться, что он загружает сборку так же, как и любую другую сборку.NET.

Предполагая, что он просто вызывает Assembly.Load() со значением ClassName, он будет следовать правилам привязки.NET. Сначала посмотрите в GAC, если не найден, будет проверяться - поэтому, если определена кодовая база, он будет только там смотреть, иначе он будет проверять на основе базы приложения (по умолчанию каталог приложения [, но не для ASP.NET). ]).

Я думаю, что это соответствует тому, что вы читаете в регазме.

Ваш вопрос настолько старый, что, я полагаю, это был OBE, но правила, которые вы использовали бы для размещения сборок в каталоге приложения, использования кодовой базы или в GAC, такие же, как и без com-взаимодействия. Каждая ситуация отличается, и я не сделал достаточно.NET, чтобы отказаться от каких-либо глубоких идей. Я предпочитаю установку xcopy, поэтому я бы пошел в каталог приложения (и использовал бы свободный от регистрации COM), но есть и другие соображения, например, если два приложения vb должны использовать одну и ту же версию COM-объекта.

Другие вопросы по тегам