2009-07-06 6 views
2

오늘은 ATL 라이브러리를 사용하여 VC++ 7.x (Visual Studio 2003 및 .Net 1.1)를 사용하여 out-of-process (즉 EXE) COM 서버를 작성했습니다. 이 서버는 MTA (Multi Threaded Apartment) 모델을 사용했으며 DCOM 호출 (VB6 클라이언트)에 의해 활성화되었습니다. 여러 클라이언트 요청은 첫 번째 요청 (COM 인프라에 의해 자동으로)에 의해 활성화되는 단일 프로세스에 의해 충족됩니다.기존 클라이언트를 손상시키지 않고 이전 DCOM 서버를 다시 구현하려면 어떻게해야합니까?

꽤 복잡한 코드 조각이었습니다. 이제 코드를 약간 변경해야합니다. 불행히도 필자가 구축 한 시스템은 오래 전에 사라졌고 VS 2003을 사용하여 새 컴퓨터에서 프로젝트를 컴파일하는 데 문제가 있습니다. 몇 년 전이 프로젝트를 VS 2005로 옮겨 놓은 것을 보았습니다. ATL 라이브러리에 대한 변경 사항을 깨고 그 노력을 포기했습니다.

이 낡은 VS 2003 C++ 프로젝트를 구축 할 때의 현재의 문제를 다루기보다는 .NET에서 다시 작성하는 것에 관심이 있습니다. 이것은 내 작은 가게 (우리가 C++을 더 이상 사용하지 않는 곳)에서 훨씬 더 유지 보수가 가능할 것입니다. ATL 매크로와 C++ 숙어는 내 기억에서 사라진 지 오래되었으며, 나는 거기에 머물고 싶습니다. :-)

그래서 C#/VS2008에서이 rewite를 실행하는 것이 얼마나 실현 가능한지 모색하고 있습니다. .NET 클래스를 COM 클라이언트에 노출 할 수 있다는 것을 알고 있습니다. 사실 나는 과거의 간단한 것들로 그렇게했습니다. 그러나 이것은 훨씬 더 복잡합니다. 나는 여러 가지의 확실하지 않다 : 인터페이스가 모든 클라이언트에 의해 소비되는 형식 라이브러리에 정의되어

  1. (즉 unmodifed 유지해야합니다). 기존 형식 라이브러리를 기반으로 이러한 인터페이스를 구현하는 .NET 서버를 구축 할 수 있다고 가정 해 봅시다.

  2. 서버는 IDispatch를 상속하고 "이중"및 "oleautomation"으로 표시된 여러 인터페이스를 구현합니다. 예를 들어 :

    [odl, uid(...), dual, oleautomation] 
    interface IKDFTSearchManager : IDispatch { 
    
         HRESULT Method1(...); 
         HResult Method2(...); 
    } 
    

    나는 클라이언트의이 IDispatch 메서드를 사용하는 것이 생각하지 않는다, 그러나 나는 상호 운용성에 의해 생성 된 VTABLE가 일치해야한다고 가정합니다. .NET 서버에서이를 어떻게 노출시킬 수 있습니까?

  3. 어떤 유형의 프로젝트에 구성 요소가 있어야합니까? 콘솔 응용 프로그램?

  4. DCOM은 interop 도구 중 하나에 적절히 등록 된 경우 EXE를 활성화 할 수 있습니다. 그럴까요? C++/ATL 서버에서와 마찬가지로 인프라가 작동합니까? 즉, 여러 클라이언트 요청을 처리하는 단일 EXE가 활성화됩니다.

  5. (4)와 관련하여이 서버는 다중 스레드 아파트 모델을 사용합니까?

답변

0

나는 비슷한 배경에서 왔으며 특히 클라이언트를 만지지 않으려 고 할 때 상당한 노력이 필요합니다.

Tlbexp.exe이라는 .NET SDK 도구가 있습니다.이 라이브러리는 .Net 어셈블리의 형식 라이브러리를 내 보냅니다. 이전 COM 서버와 같은 형식 라이브러리를 생성하기 위해 새 C# 어셈블리 (dll)에 대해이 도구를 사용해야한다고 가정합니다.

2

시작하려면 다음을 읽어보십시오. this(C#으로 큰 C++ 응용 프로그램을 다시 작성한 적이 있습니까?)

ServicedComponent은 .NET에서 DCOM 서버를 구현하는 공식적인 방법입니다.

프로젝트는 COM +에서 호스트하는 클래스 라이브러리가됩니다. 서비스로 프로젝트를 호스트 할 수도 있습니다. 다시 말하면 호스트 COM +를 작성하지 않아도됩니다.

이전 tlb를 참조 할 수 있지만 (프로젝트 내에서 p/invoke 인터페이스를 작성하는 것이 좋습니다) 인터페이스를 구현할 수 있습니다.

이전 버전을 유지하려면 ProgIdAttribute을 사용해야합니다.

관련 문제