Как программа COM находит.NET DLL, зарегистрированную для взаимодействия COM?
Один клиент хочет использовать наши.NET DLL из VB6. Они предназначены для поддержки обратного взаимодействия, и все работает нормально... за исключением: есть две отдельные программы VB6 в двух разных каталогах. Кажется, необходимо сделать одно из:
- Скопируйте.NET DLL в обе директории, или
- Установите.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-объекта.