Мне нужно создать 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), конечно, я не зарегистрировал его с помощью regasm
Я не использую подход, описанный в руководстве, мне кажется, что он не работает. Создаю 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>
I've added manifest to SideBySide.dll with command
mt -outputresource: "" -manifest "SideBySide.manifest"
Я экспортировал tlb из библиотеки SideBySide .Net с помощью tlbexp
Я установил Нет в свойствах конфигурации -> Инструмент манифеста -> Вставить манифест клиента c ++
Я скомпилировал 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 из собственного клиента.
Есть какое-то обходное решение, или мне нужен другой подход к моей проблеме