C # — .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), конечно
    Я не зарегистрировал его по регазму

  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. Я добавил манифест в SideBySide.dll с помощью команды

mt -outputresource: «» -manifest «SideBySide.manifest»

  1. Я экспортировал tlb из библиотеки SideBySide .Net, используя tlbexp

  2. Я поставил нет в свойствах конфигурации -> Manifest tool -> Embed Manifest клиента c ++

  3. Я скомпилировал client.exe, а затем применил изменения к файлу che 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 из нативного клиента.

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

0

Решение

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

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

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

Дополнительным преимуществом является отсутствие необходимости генерирования библиотеки типов для сборки .NET.

0

Другие решения

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

У меня была эта проблема сегодня утром. Моя свободная 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. Любое решение, кажется, решает проблему.

0

По вопросам рекламы [email protected]