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

#c# #c #com #registration-free-com

#c# #c #com #регистрация-бесплатная-com

Вопрос:

Мне нужно создать COM-объект без регистрации в .Net Framework с помощью C #.

Я следил за пошаговым руководством по MSDN. Я должен работать над этим, потому что, или это недостаточно ясно для меня, или это неверно, однако это старый пост, и я использую Visual Studio 2015 в Windows 10, поэтому, возможно, что-то изменилось.

Ниже приведены шаги, которые я сделал, чтобы заставить его работать:

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

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

    mt -outputresource:"<path SidebySide.dll>" -manifest "<SideBySide.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>
    </assembly>
      
  4. Я добавил манифест SideBySide.dll с помощью этой команды:

    mt -outputresource:"<Path SidebySide.dll>" -manifest "SideBySide.manifest"

  5. Я экспортировал TLB из SideBySide.dll using tlbexp `.

  6. Я установил No в конфигурации Properties -> Manifest tool -> Embed Manifest клиента C .

  7. Я скомпилировал 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 сохраняется. Я попытался не только исправить, но и удалить все ссылки на версию