2009-09-15 4 views
2

C#에서 COM 인터페이스 선언을 작성할 때 준수해야하는 "규칙"이 있습니까? 나는 거기에 관한 정보를 얻고 싶다고 생각한다. 예를 들어 나는 ITaskbarList, ITaskbarList2 및 ITaskbarList3 인터페이스와 주변 놀겠다는거야 그리고이 순서대로 정확히 구현을 관리합니다 내가COM 인터페이스 선언

  • 들이 관리되지 않는에 표시되는 멤버의 순서를 선언해야 나에게 보인다 인터페이스 선언.

예를 들어 다음과 같은 상황이 잘 작동 보인다

[ComImport] 
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList 
{ 
    void HrInit(); 
    void AddTab([In] IntPtr hwnd); 
    void DeleteTab([In] IntPtr hwnd); 
    void ActivateTab([In] IntPtr hwnd); 
    void SetActiveAlt([In] IntPtr hwnd); 
} 

구성원을 재정렬하는

[ComImport] 
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList 
{ 
    void DeleteTab([In] IntPtr hwnd); 
    void HrInit(); 
    void AddTab([In] IntPtr hwnd); 
    void SetActiveAlt([In] IntPtr hwnd); 
    void ActivateTab([In] IntPtr hwnd); 
} 
  • 는 단일 관리 인터페이스 선언에서 관리되지 않는 인터페이스를 상속 선언해야 기능을 파괴하는 동안

    관리되는 인터페이스에서 상속을 사용하는 대신 각각의 새로운 인터페이스에서 부모 선언을 다시 선언하는 대신 자체 관리 인터페이스 (Guid 특성 등으로 완료)에서 관리되지 않는 각 인터페이스를 선언하고 상속을 사용하려고합니다. 여전히하면서

예를 들어,이 대신에 나는 다음과 같은

[ComImport] 
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList2 
{ 
    void HrInit(); 
    void AddTab([In] IntPtr hwnd); 
    void DeleteTab([In] IntPtr hwnd); 
    void ActivateTab([In] IntPtr hwnd); 
    void SetActiveAlt([In] IntPtr hwnd); 
    void MarkFullscreenWindow(
     [In] IntPtr hwnd, 
     [In, MarshalAs(UnmanagedType.Bool)] bool fullscreen); 
} 

즉를하도록 강요하고있어

[ComImport] 
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList 
{ 
    void HrInit(); 
    void AddTab([In] IntPtr hwnd); 
    void DeleteTab([In] IntPtr hwnd); 
    void ActivateTab([In] IntPtr hwnd); 
    void SetActiveAlt([In] IntPtr hwnd); 
} 

[ComImport] 
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface ITaskbarList2 
    : ITaskbarList 
{ 
    void MarkFullscreenWindow(
     [In] IntPtr hwnd, 
     [In, MarshalAs(UnmanagedType.Bool)] bool fullscreen); 
} 

작동 표시되지 않습니다 단일 인터페이스에서 선언 회원 순서.

그래서 관리되지 않는 상대방을 위해 관리 인터페이스를 선언하기위한 지침은 무엇입니까? 내가 원하는 것을 얻기 위해 어쨌든, 관리 상속을 인터페이스 상속 + 내가 원하는 순으로 멤버를 선언하십시오. (알파벳 순으로 정렬하고 싶습니다.)

답변

3

당신의 발견은 vtables로 인해 발생합니다. vtable 순서를 변경할 수 없으며 다른 인터페이스에서 상속 된 인터페이스에는 항상 vtable의 모든 기본 항목이 있습니다. 따라서 원하는 규칙은 "vtable이 동일한 지 확인하십시오."

+0

그래서 .net은 이름을 기반으로하는 vtable 항목의 자동 매핑을 통해 저를 부려 먹지 않습니까? 어쨌든 속성 등을 사용하여 구성하려면 어떻게해야합니까? 또한 왜 상속이 효과가 없을까요? 그게 상속 사슬을 따라 vtable을 연결하겠습니까? 즉, 먼저 ITaskbarList에 대한 항목을 ITaskbarList2에 대한 다음 ITaskbarList3에 대한 또는 .. 상속에도 불구하고 ITASbarListList3의 마지막 인터페이스 항목 만 사용합니까? – TheCodeJunkie

+3

다른 인터페이스를 상속하는 인터페이스는 항상 vtable의 모든 기본 항목을가집니다. 각 인터페이스의 구성원 순서가 올바른 경우 인터페이스의 vtable 항목이 다른 인터페이스를 상속, 올바른 결국 것인가? – TheCodeJunkie

+2

나는 내 자신의 후속 질문에 대답 할 것이다. .NET interop은 인터페이스 상속을 지원하지 않으므로 하위 인터페이스에서 부모 인터페이스 멤버를 재정의해야합니다. – TheCodeJunkie

관련 문제