2012-03-06 3 views
12

Dotnet interop 및 C#에 등록 무료 COM을 사용할 수 있습니까? 그렇다면 C# 프로젝트에서 COM 개체에 대한 참조를 추가하는 방법은 무엇입니까?Reg에서 무료 COM interop with C#, 가능?

나는 임베디드 매니페스트와 두 개의 테스트 클라이언트가있는 자유로운 ATL COM 서버 dll을 가지고있다. 하나는 cpp이고 다른 하나는 C#이다. CPP를 클라이언트가 제대로 링커에서 "= '1.0.0.0'을 입력 = '는 Win32'이름 = 'TestComSvr1'버전 'import 문 및 중

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

또는 설정'추가 매니페스트 종속성 '을을 사용하여 COM 객체를 참조 -> 매니페스트 파일 옵션을 사용하면 COM 구성 요소가 동일한 디렉토리에있는 한 cpp 클라이언트가 올바르게 실행됩니다.

C# 클라이언트는 게임을 전혀 거절합니다.

등록되지 않은 COM 구성 요소 DLL 또는 오류에 등록 TLB 결과 중 하나에 파일 참조를 추가하려고 : 'regtlib의 TestComSvr'로 단지 형식 라이브러리를 등록

"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".

다음 파일 또는 하나를 만드는 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)).

참고 :이 궁극적으로 여전히 구성 요소의 등록을 요구하기 때문에 그것은 어쨌든 유용한 경우가 아닐 것이다 일을하더라도, 난 그냥 그것을 테스트 완전.

지금까지 COM 개체를 C#에서 참조 할 수 있었던 유일한 방법은 COM 개체 자체를 등록하는 것입니다. 물론 COM 개체 자체를 등록하는 것입니다.이 시점부터 전혀 포인트가 없어지지 만 전혀 reg-free가 아닙니다.

누구나 아이디어가 있습니까?

(이것은 VS2010 sp1이있는 WinXP에 있습니다).

+0

Visual Studio EXE 자체에 대한 매니페스트 파일을 만들어야 할 필요가 있는지 궁금하십니까? 이 링크를 찾았지만 도움이 될지 확실하지 않은 경우 http://msdn.microsoft.com/en-us/library/ms973913.aspx – PeskyGnat

+2

또한 tlbimp를 사용하여 interop dll을 만들고 참조하면 어떻게됩니까? 즉 'tlbimp '? – PeskyGnat

답변

12

는 다음을 수행해야합니다

당신은 당신이 중성미자에 의존성을 명시 등록이 필요없는 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> 

참고 :

    : 나는

  1. 그런 다음 당신이 당신의 C#을 exe를 매니페스트이 응용 프로그램을 포함 할 필요가 Registration-Free COM from ASP.NET? 내 질문에 유사한 매니페스트를했다

  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하십시오.
  3. "새 항목 추가"을 클릭하십시오.
  4. "응용 프로그램 매니페스트 파일"을 선택하십시오.

이 단계는 adding a manifest to a managed application에 대한 MSDN에서 찾을 수 있습니다 것과 유사하다.

당신은 또한 등록이 필요없는 COM 항목의 당신의 Neutrino.TestComSvr2 ​​ 어셈블리가 포함되어 있는지 확인해야합니다

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

+0

이 매니페스트는 거의 그대로 작동하지만 응용 프로그램 매니페스트의 dependendAssebmly : name = "mycomserver.dll"의 끝에 ".dll"을 넣어야했습니다. –