.NET Framework (v 4.0) Регистрация COM бесплатно вызывается из приложения Win32 C ++

Мне нужно создать COM-объект без регистрации в .Net Framework c #. Я следил за пошаговым руководством по msdn https://msdn.microsoft.com/en-us/library/ms973915.aspx. Я должен поработать над этим, потому что либо мне это недостаточно ясно, либо это неверно, однако это старый пост, и я использую Visual Studio 2015 в Windows 10, поэтому, возможно, что-то изменилось. Вот шаги, которые я сделал, чтобы заставить его работать

  1. Скомпилируйте COM C # dll SideBySide.dll (Target Framework 2.0), конечно, я не зарегистрировал его с помощью regasm

  2. Я не использую подход, описанный в руководстве, мне кажется, что он не работает. Создаю SideBySide.Manifest с помощью mt.exe здесь команда

    mt -outputresource: "" -manifest ""

  3. Я вручную изменил сгенерированный манифест, чтобы удалить все ненужные теги и добавить обязательные здесь, в следующем измененном манифесте.

      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        name="SideBySide"
        version="1.0.0.0"
        type="win32" />
        <clrClass
                  clsid="{4B72FC46-C543-4101-80DB-7777848D1357}"
                  progid="SideBySide.SideBySideClass"
                  threadingModel="Both"
                  name="SideBySide.SideBySideClass"
                  runtimeVersion="v2.0.50727">
        </clrClass>
        <file name="SideBySide.dll">
     </file>
    

  4. I've added manifest to SideBySide.dll with command

mt -outputresource: "" -manifest "SideBySide.manifest"

  1. Я экспортировал tlb из библиотеки SideBySide .Net с помощью tlbexp

  2. Я установил Нет в свойствах конфигурации -> Инструмент манифеста -> Вставить манифест клиента c ++

  3. Я скомпилировал client.exe, а затем внес изменения в файл client.exe.manifest. Здесь в дальнейшем измененный манифест

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type = "win32" name = "client" version = "1.0.0.0" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="SideBySide" version="1.0.0.0" /> </dependentAssembly> </dependency> </assembly>

Все работает хорошо, и кажется, что я могу использовать COM-интерфейс .Net Framework из собственного приложения на C ++. Однако возникает проблема, когда я пытаюсь скомпилировать SideBySide с .Net Framework 4.0 или новее, когда я вызываю CreateInstance

ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));

Эта ошибка возникает: 0x8013101b: эта сборка создана средой выполнения более новой, чем текущая загруженная среда выполнения, и не может быть загружена. Конечно, я пытался выполнить все шаги, перечисленные выше, я также пытаюсь указать версию времени выполнения в манифесте dll, но это было бесполезно. Я также прочитал этот пост https://blogs.msdn.microsoft.com/dsnotes/2012/08/10/error-0x8013101b-when-doing-a-registration-free-com-activation/ Проблема в том, что то же самое, но решение, на мой взгляд, мне не подходит, потому что мне нужно вызвать C # COM из собственного клиента.

Есть какое-то обходное решение, или мне нужен другой подход к моей проблеме


person Alessandro Ciurlo    schedule 11.10.2016    source источник
comment
Удалось ли вам решить эту проблему?   -  person Alex B.    schedule 28.03.2019
comment
Извините за поздний ответ. Надеюсь, вы решили свою проблему. Однако да, я решил свою проблему. В том, что я написал, нет ничего плохого, кроме версии от v2.0.50727 до v4.0.30319. Я предлагаю написать свой манифест самостоятельно без использования автоматического инструмента ... используя образец, который я перечислял ранее. У меня также есть небольшой образец консольного приложения, вызывающего библиотеку C # SxS, если вам нужно   -  person Alessandro Ciurlo    schedule 03.04.2019
comment
Спасибо за ответ. Мне не удалось добиться успеха с манифестом, потому что собственное приложение не хотело загружать v4.0.30319 CLR, оно, по-видимому, загружало более низкую версию, с которой компонент был несовместим. Итак, я нашел другой способ сделать это без регистрации и даже без манифеста, вам просто нужно указать путь к вашей .net dll: codeproject.com/Articles/1199546/ Этот подход работает довольно надежно во всех необходимых мне случаях.   -  person Alex B.    schedule 03.04.2019


Ответы (2)


Я ценю это немного поздно, но для всех, кто сталкивается с этим ...

Сегодня у меня была эта проблема. Моя COM-библиотека с бесплатной регистрацией построена с помощью .Net 4.5.2, мое решение заключалось в использовании атрибута runtimeVersion следующим образом

<clrClass 
   clsid="{...}" 
   progid="Library.Name" 
   threadingModel="Both" 
   name="Library.Name.Class"
   runtimeVersion="v4.0.30319">

В качестве альтернативы вы можете опустить атрибут runtimeVersion (или указать v2.0.50272) и скомпилировать свою библиотеку для .Net 3.5. Кажется, что любое решение решает проблему.

person 0909EM    schedule 04.11.2017

Я только догадываюсь, но вы говорите, что в вашем файле манифеста версия времени выполнения - 2.0.50727, но у вас проблемы с компиляцией с 4? У вас несоответствие версии вашему манифесту и вашим инструментам.

Я просто использую инструмент манифеста для создания и хранения информации в моей сборке (на этапе PostBuild):

"$(PathToYourTools)\mt.exe" -managedassemblyname:$(TargetPath) -nodependency -outputresource:$(TargetPath);#2

Он имеет дополнительное преимущество, так как не требует создания библиотеки типов для сборки .NET.

person Joseph Willcoxson    schedule 11.10.2016
comment
Я попробовал ваш совет, добавив на этапе пост-сборки команду mt для создания и сохранения информации, конечно, команда выполняется успешно, но ошибка 0x8013101b сохраняется. Пытался не только поправить, но и убрать ссылку на версию - person Alessandro Ciurlo; 12.10.2016