Мне нужно создать бесплатный COM-объект регистрации в .Net Framework c #.
Я следовал за MSDN прохождение https://msdn.microsoft.com/en-us/library/ms973915.aspx. Я должен работать над этим, потому что, или это недостаточно ясно для меня, или это не правильно, однако это старый пост, и я использую Visual Studio 2015 на Windows 10, так что, возможно, что-то изменилось.
Вот в следующих шагах, которые я сделал, чтобы заставить его работать
Скомпилируйте COM C # dll SideBySide.dll (Target Framework 2.0), конечно
Я не зарегистрировал его по регазму
Я не использую подход, описанный в руководстве, он мне не подходит. Создаю SideBySide.Manifest mt.exe здесь командой
mt -outputresource: «» -manifest «»
Я вручную изменил сгенерированный манифест, чтобы удалить все ненужные теги и добавить обязательные здесь в следующем модифицированном манифесте.
<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>
Я добавил манифест в SideBySide.dll с помощью команды
mt -outputresource: «» -manifest «SideBySide.manifest»
Я экспортировал tlb из библиотеки SideBySide .Net, используя tlbexp
Я поставил нет в свойствах конфигурации -> Manifest tool -> Embed Manifest клиента c ++
Я скомпилировал 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 из нативного клиента.
Есть какой-то обходной путь, или мне нужен другой подход к моей проблеме
Я только догадываюсь, но вы говорите, что в вашем манифест-файле версия времени выполнения — 2.0.50727, но у вас возникают проблемы при компиляции с 4? У вас несоответствие версии с вашим манифестом и вашими инструментами.
Я просто использую инструмент манифеста для создания и хранения информации в моей сборке (на шаге PostBuild):
"$(PathToYourTools)\mt.exe" -managedassemblyname:$(TargetPath) -nodependency -outputresource:$(TargetPath);#2
Дополнительным преимуществом является отсутствие необходимости генерирования библиотеки типов для сборки .NET.
Я ценю это немного поздно, но для всех, кто сталкивается с этим …
У меня была эта проблема сегодня утром. Моя свободная 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. Любое решение, кажется, решает проблему.