В настоящее время я работаю над смешанной собственной/управляемой цепочкой приложений, в которой используется COM без регистрации. Следующее изображение иллюстрирует это:Внедрить манифест COM-регистрации в C# dll с родной/управляемой средой
C# обертка DLL была создана при помощи утилиты Tlbimp.exe. Это позволяет каждому из исполняемых файлов C# обращаться к собственным типам и методам в COM-библиотеке. Сама COM-библиотека использует манифест RegFree COM на основе сервера.
Все работает нормально, когда клиентские реестры RegFree COM встроены в исполняемые файлы C#. Тем не менее, я хотел бы перемещать и унифицировать эти файлы манифеста в C# DLL, что значительно облегчило бы обслуживание и синхронизацию информации о версии.
Поскольку Visual Studio не предоставляет возможность встраивать файл манифеста в библиотеку классов C#, я попытался извлечь, изменить и повторно внедрить манифест DLL по умолчанию с помощью инструмента манифеста (mt.exe). Это, кажется, работает, как C# DLL в настоящее время предоставляет следующий манифест, когда выполняется запрос с мтом:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentity name="FirstClient" version="1.0.0.0" processorArchitecture="msil"></assemblyIdentity><file name="FirstClient.dll" hashalg="SHA1"></file>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="atl" version="1.0.0.0"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Однако исполняемые файлы отказываются работать, каждый из которых жалуется на COM класс фабрике не будучи в состоянии найти отсутствующий COM-модуль.
Есть ли что-то, что я упустил здесь? Благодарю.
@HansPassant Спасибо, я не знал, что можно было добавлять манифесты в библиотеки классов в VS. Что касается вашего второго замечания: Да, было бы здорово, если бы я мог избежать дополнительной DLL TLB. Однако проект DLL Visual C# не позволит мне добавить ссылку на COM tlb или сама COM-библиотека. Он жалуется, что эти файлы не являются компонентами COM. Вот почему я полагался на обертку TLB до сих пор. – Aurora
Подождите, есть еще одна проблема, Windows никогда не будет выглядеть в DLL для манифеста. Они не загружаются нормально, без вызова LoadLibrary(), поэтому у загрузчика Windows нет причин искать встроенный манифест. Вам нужно будет сделать это в программном обеспечении, pinvoke CreateActCtx(). Также используется в .NET, выполните поиск в Reference Source it. –
@Aurora не могли бы вы предоставить дополнительную информацию в своем ответе о том, как вы это сделали? У меня такая же проблема, как и вы. – JosephGarrone