#c# #c #com #registration-free-com
#c# #c #com #регистрация-бесплатная-com
Вопрос:
Мне нужно создать COM-объект без регистрации в .Net Framework с помощью C #.
Я следил за пошаговым руководством по MSDN. Я должен работать над этим, потому что, или это недостаточно ясно для меня, или это неверно, однако это старый пост, и я использую Visual Studio 2015 в Windows 10, поэтому, возможно, что-то изменилось.
Ниже приведены шаги, которые я сделал, чтобы заставить его работать:
-
Скомпилируйте COM C # dll
SideBySide.dll
(Target Framework 2.0), конечно, я не зарегистрировал ее с помощью regasm. -
Я не использую подход, описанный в руководстве, кажется, он не работает для меня. Я создаю
SideBySide.Manifest
с помощьюmt.exe
, вот команда:mt -outputresource:"<path SidebySide.dll>" -manifest "<SideBySide.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> </assembly>
-
Я добавил манифест
SideBySide.dll
с помощью этой команды:mt -outputresource:"<Path SidebySide.dll>" -manifest "SideBySide.manifest"
-
Я экспортировал TLB из
SideBySide.dll using
tlbexp `. -
Я установил No в конфигурации
Properties -> Manifest tool -> Embed Manifest
клиента 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.dll
с .Net Framework 4.0 или новее возникает проблема, когда я вызываю CreateInstance
:
ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));
Возникает эта ошибка:
0x8013101b: эта сборка создается средой выполнения, более новой, чем загруженная в данный момент среда выполнения, и не может быть загружена.
Конечно, я пытался выполнить все шаги, перечисленные выше, я также пытаюсь указать версию среды выполнения в манифесте DLL, но это не помогло.
Я также прочитал этот пост. Проблема та же, но решение, на мой взгляд, мне не подходит, потому что мне нужно вызвать COM-объект C # из собственного клиента.
Есть ли какое-то обходное решение или мне нужен другой подход к моей проблеме?
Комментарии:
1. Удалось ли вам решить эту проблему?
2. Извините за поздний ответ. Я надеюсь, что вы решили свою проблему. Однако да, я решил свою проблему. В том, что я написал, нет ничего плохого, за исключением версии времени выполнения от версии v2.0.50727 до версии v4.0.30319. Я предлагаю написать свой манифест самостоятельно, не используя автоматический инструмент… используя пример, который я перечислил ранее. У меня также есть небольшой пример консольного приложения, вызывающего библиотеку c # SxS, если вам нужно
3. Спасибо за ответ. Я не справился с материалом манифеста, потому что собственное приложение не хотело загружать версию 4.030319 CLR, оно, по-видимому, загрузило более низкую версию, с которой компонент был несовместим. Итак, я нашел другой способ сделать это без регистрации и даже без манифеста, вам просто нужно указать путь к вам. net dll: codeproject.com/Articles/1199546/… Этот подход работает достаточно надежно для всех случаев, которые мне нужны.
Ответ №1:
Я ценю это немного поздно, но для всех, кто сталкивается с этим…
У меня была эта проблема ранее сегодня. Моя бесплатная библиотека 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. Любое решение, по-видимому, решает проблему.
Ответ №2:
Я только предполагаю, но вы говорите, что в вашем файле манифеста указана версия среды выполнения 2.0.50727, но у вас возникли проблемы с компиляцией с 4? У вас несоответствие версии с вашим манифестом и вашими инструментами.
Я просто использую инструмент манифеста для создания и сохранения информации в моей сборке (на этапе последующей сборки):
"$(PathToYourTools)mt.exe" -managedassemblyname:$(TargetPath) -nodependency -outputresource:$(TargetPath);#2
Дополнительным преимуществом является то, что не требуется генерировать typelib для .ЧИСТАЯ сборка.
Комментарии:
1. Я попробовал вашу подсказку, добавив на этапе сборки после сборки команду mt для создания и сохранения информации, конечно, команда выполнена успешно, но ошибка 0x8013101b сохраняется. Я попытался не только исправить, но и удалить все ссылки на версию