Подтвердить что ты не робот

Reg бесплатный COM-взаимодействие с С#, возможно?

Можно ли использовать бесплатный бесплатный COM с Dotnet interop и С#? Если да, то как добавить ссылку на объект COM в проекте С#?

У меня есть бесплатная версия ATL COM-сервера с встроенным манифестом и двумя тестовыми клиентами, одна cpp другая С#. Клиент cpp правильно ссылается на COM-объект, используя оператор import, и

#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"")

или установите для параметра "Дополнительные манифесты манифеста" значение "type = 'win32" name=' TestComSvr1 'version =' 1.0.0.0 '' в разделе "Параметры Linker- > Manifest File", после чего клиент cpp будет работать правильно так долго поскольку COM-компонент находится в одном каталоге.

Клиент С#, хотя и отказывается играть вообще.

Попытка добавить ссылку на файл для DLL незарегистрированного COM-компонента или незарегистрированного tlb приводит к ошибке:

"Ссылка на" бла-бла "не может быть добавлена. Убедитесь, что файл доступен, и что он является допустимой сборкой или COM-компонентом".

Регистрация только библиотеки типов с помощью "regtlib TestComSvr", а затем создание либо файла, либо ссылки на COM, что приводит к тому, что проект С# не создается с помощью:

"Ошибка загрузки библиотеки типов /Dll. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))".

Регистрация компонента COM и создание ссылки обычно в проекте С#, установка ссылки на Изолированный, создание проекта С#, а затем отмена регистрации компонента и запуск проекта С# в этом исключении:

Извлечение COM-класса factory для компонента с CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Примечание. Даже если это сработало, это все равно не будет полезным, так как в конечном счете он все еще требует регистрации компонента, я просто проверил его для тщательности.

До сих пор единственным способом, с помощью которого я мог ссылаться на COM-объект из С# вообще, является регистрация самого COM-объекта, который, конечно же, полностью побеждает точку с тех пор, когда она вообще не является reg-free.

У кого-нибудь есть идеи?

(Это на WinXP с VS2010 sp1).

4b9b3361

Ответ 1

Вам необходимо:


  • Вам нужно приступить к манифесту сборки COM без регистрации, где вы заявляете о своей зависимости от сборки Neutrino.TestComSvr2 ​​:

    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
                xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
                xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
       <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    
       <!-- We depend on our COM object -->
       <dependency>
          <dependentAssembly>
              <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" />
          </dependentAssembly>
       </dependency>
    
    
       <!-- 
           Everything else in this sample manifest is not relavent to this answer, 
           but every developer should be doing their job and writing correct 
           Windows programs 
       -->
    
       <!-- Disable file and registry virtualization. -->
       <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
          <security>
             <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
             </requestedPrivileges>
          </security>
       </trustInfo>
    
       <!-- We are high-dpi aware on Windows Vista -->
       <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
          <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
             <dpiAware>true</dpiAware>
          </asmv3:windowsSettings>
       </asmv3:application>
    
       <!-- Declare that we were designed and tested on Windows 7-->
       <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
          <application>
              <!--The ID below indicates application support for Windows 7 -->
              <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
              <!--The ID below indicates application support for Windows Vista -->
              <!-- supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/ -->
          </application>
       </compatibility>
    
       <!-- We depend on Common Controls version 6 (i.e. "enable themes") -->
       <dependency>
          <dependentAssembly>
             <assemblyIdentity
                   type="win32"
                   name="Microsoft.Windows.Common-Controls"
                   version="6.0.0.0"
                   processorArchitecture="*"
                   publicKeyToken="6595b64144ccf1df"
                   language="*"
             />
          </dependentAssembly>
       </dependency>
    

    Примечание: У меня был аналогичный манифест в моем вопросе Без регистрации COM из ASP.NET?

  • Затем вам нужно включить этот манифест приложения в свой С# exe:

    • Щелкните правой кнопкой мыши проект в обозревателе решений.
    • Нажмите "Добавить новый элемент" .
    • Выберите "Файл манифеста приложений" .

Эти шаги аналогичны тем, что можно найти в MSDN для добавления манифеста в управляемое приложение.

Вам также необходимо убедиться, что ваша сборка Neutrino.TestComSvr2 ​​ содержит записи COM без регистрации:

Neutrino.TestComSvr2.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" />

   <file name = "ContosoFrobber.dll">

      <comClass
            progid="Frobber.Gizmo"
            clsid="{00028C00-0000-0000-0000-000000000046}"
            description="Gizmo Frobber by Contoso"
            threadingModel = "Apartment" />

      <typelib 
            tlbid="{00028C01-0000-0000-0000-000000000046}"
            version="1.0" 
            helpdir=""/>
   </file>
</assembly>

И blingo blango, вы должны работать.