2012-03-08 2 views
0

나는 P2P 클래스 인 C#을 가지고있다.com 개체 인터페이스로 C# 클래스를 노출하는 방법?

public int portRecv=10101; 
    public int portSend = 10102; 
    public int multicastPort=10103; 
    int memberNum = 0; 
    string data; 
    string time; 
    List<Member> MemberList = new List<Member>(); 
    public void DisplayMembers(); 
    public void start(...); 
    public void join(..); 
    public void leave(..); 
    void add(...); 
    void remove(...); 

C#과 C++ 사이의 interop 통신에서이 클래스의 서버 측 코드를 어떻게 만듭니 까?

http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx 예를 우리는 방법

의 그룹이 될 수있는 인터페이스를 쓸 수 있지만 내가 portsend 다른 사람들처럼 내 변수 ++ 클라이언트 측 코드를 C로 시작됩니다 방법에 관한 혼란 스러워요하는 방법을 보여줍니다.

--- 편집 --- com 인터페이스로 영구 데이터를 유지할 수 있습니까? 예를 들어 위에서 언급 한 목록? 관리 코드 com 개체와 통신하는 관리되지 않는 코드에서이 클래스의 개체를 만들 수 있습니까?

답변

1

COM 인터페이스에서 필드를 노출 할 수 없으며 속성 및 메서드 만 지원됩니다. 이것은 일반적으로 C# 프로그래밍에 좋은 널리 채택 된 연습뿐만 아니라 여기에 있습니다 : 실제로 C# 코드에서 인터페이스를 선언하여 성공의 구덩이에

public class PortWrapper { 
    public int ReceivePort { 
     get { return portRecv; } 
     set { 
     if (value == portRecv) return; 
     if (value < 256 || value > 65535) throw new ArgumentOutOfRangeException(); 
     portRecv = value; 
     setupReceiver(); 
     } 
    } 
    // etc.. 

    private int portRecv=10101; 
} 

가을. 그 이후의 모든 아이디어 덕분에 [ClassInterface (ClassInterfaceType.None)]을 사용하여 구현 클래스 세부 정보를 숨기고 [InterfaceType (ComInterfaceType.InterfaceIsDual)]로 순수 인터페이스를 노출 할 수 있습니다. 그것은 자연스러운 COM 방식입니다.

+0

내 P2PLib 클래스의 객체를 만들 때 순수한 C# 코드에서 객체는 클라이언트 목록과 같은 내부 데이터를 보유합니다. 내 C# com 객체의 메소드 만 내 미래 C++ 코드에 노출 시키므로 C# 코드의 목록과 같은 영구 데이터를 사용할 수 없습니까? –

+0

물론 가능합니다. 여전히 클래스 객체입니다. COM은 coclass를 지원하지만 정적 데이터의 개념조차 가지고 있지 않습니다. C++ 코드는'obj-> get_ReceivePort (& port)'와 같은 값을 얻기 위해 getter 메소드의 속성을 사용해야 할 것입니다. 속성을 지원하는 다른 언어는 C#과 마찬가지로 속성을 필드처럼 보이게합니다. –

관련 문제