c#
  • visual-studio-2010
  • com
  • 2012-03-06 58 views 12 likes 
    12

    有没有可能使用注册免费的COM与Dotnet互操作和C#?如果是的话,如何在C#项目中添加对COM对象的引用?注册免费COM与C#互操作,可能吗?

    我有一个免费的ATL COM服务器DLL与一个嵌入式清单和两个测试客户端,一个CPP其他C#。 CPP的客户端正确地引用使用导入语句,要么

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

    或设定“附加清单依赖”到COM对象“类型=‘的win32’名称=‘TestComSvr1’版本=‘1.0.0.0’”接头下 - > Manifest File选项,之后只要COM组件位于同一目录中,cpp客户端就可以正常运行。

    虽然c#客户端拒绝播放。

    尝试的文件引用添加到或者未登记的COM组件DLL或未注册TLB导致错误:

    "A reference to 'blah blah' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component".

    注册只是类型库与“Regtlib来TestComSvr”,然后创建一个文件或COM参照导致的C#项目未能建立与:

    "Error loading type library/Dll. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))".

    注册COM组件,并在C#项目通常建立一个基准,设定基准,以隔离,建立C#项目,然后注销该组件运行在该异常的C#项目的结果:

    Retrieving the COM class factory for component with CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

    注:即使这个工作它不会是一个有用的情况下,无论如何,因为最终它仍然需要组件的注册,我只是测试它彻底性。

    到目前为止,我一直能够从C#中引用COM对象的唯一方法是注册COM对象本身,这当然完全击败了这一点,从此它完全不是无reg的。

    任何人有任何想法?

    (这是在VSXX SP1的WinXP上)。

    +0

    想知道你是否需要为visual studio exe本身创建一个清单文件?找到这个链接,但不知道这是否有帮助http://msdn.microsoft.com/en-us/library/ms973913.aspx – PeskyGnat 2012-03-06 15:37:08

    +2

    另外,如果你创建一个互操作DLL与tlbimp和参考?即'tlbimp '? – PeskyGnat 2012-03-06 15:56:48

    回答

    12

    您需要:


    1. 你必须拿出你的免注册COM组件清单,在你的国家在中微子的扶养。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> 
      

      注:我也有类似的表现在我的问题Registration-Free COM from ASP.NET?

    2. 然后你需要包括这个应用程序在C#中的EXE清单:

      1. 右键单击解决方案资源管理器中的项目。
      2. 点击“添加新项目”
      3. 选择“应用程序清单文件”

    这些步骤类似于可以在MSDN上找到adding a manifest to a managed application

    你还需要确保你的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,你应该工作。

    +0

    这个和PeskyGnat建议直接从tlb生成interop程序集的建议的结合最终得到了这个工作,而无需注册COM组件或它的类型库。 非常感谢。 – Neutrino 2012-03-06 17:01:04

    +0

    这个清单对我来说几乎是这样工作的,但是我必须在应用程序清单中的“dependendAssebmly”的名称末尾加上“.dll”:name =“mycomserver.dll”。 – 2014-11-12 12:13:37

    相关问题