2014-09-24 7 views
4

В настоящее время я работаю над смешанной собственной/управляемой цепочкой приложений, в которой используется COM без регистрации. Следующее изображение иллюстрирует это:Внедрить манифест COM-регистрации в C# dll с родной/управляемой средой

com

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-модуль.

Есть ли что-то, что я упустил здесь? Благодарю.

+0

@HansPassant Спасибо, я не знал, что можно было добавлять манифесты в библиотеки классов в VS. Что касается вашего второго замечания: Да, было бы здорово, если бы я мог избежать дополнительной DLL TLB. Однако проект DLL Visual C# не позволит мне добавить ссылку на COM tlb или сама COM-библиотека. Он жалуется, что эти файлы не являются компонентами COM. Вот почему я полагался на обертку TLB до сих пор. – Aurora

+1

Подождите, есть еще одна проблема, Windows никогда не будет выглядеть в DLL для манифеста. Они не загружаются нормально, без вызова LoadLibrary(), поэтому у загрузчика Windows нет причин искать встроенный манифест. Вам нужно будет сделать это в программном обеспечении, pinvoke CreateActCtx(). Также используется в .NET, выполните поиск в Reference Source it. –

+0

@Aurora не могли бы вы предоставить дополнительную информацию в своем ответе о том, как вы это сделали? У меня такая же проблема, как и вы. – JosephGarrone

ответ

1

Я получил его работу, создав соответствующие функции контекста активации. Спасибо за Hans Passant за подсказку.

+0

Да, .Net и большинство других языков сценариев должны это сделать. – Bob77

 Смежные вопросы

  • Нет связанных вопросов^_^