Reg бесплатный COM-взаимодействия с C #, возможно? - PullRequest
12 голосов
/ 06 марта 2012

Можно ли использовать без регистрации COM с Dotnet взаимодействия и C #?Если да, то как добавить ссылку на COM-объект в проект C #?

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

#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-компонент находится в одном каталоге.

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

12 голосов
/ 06 марта 2012

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


  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?

  2. Затем вам нужно включить этот манифест приложения в ваш C # exe:

    1. Щелкните правой кнопкой мыши проект в обозревателе решений.
    2. Нажмите «Добавить новый элемент» .
    3. Выберите «Файл манифеста приложения» .

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

. Вам также необходимо убедиться, что ваш Neutrino.TСборка estComSvr2 ​​ содержит 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>

И Блинго Бланго, выдолжен работать.

...