문제

C#에서 COM 인터페이스 선언을 작성할 때 고수해야 할 "규칙"이 있습니까? 나는 그것에 대한 정보를 얻고 싶다고 생각합니다. 예를 들어, 나는 Itaskbarlist, Itaskbarlist2 및 Itaskbarlist3 인터페이스를 가지고 다루고 있습니다.

  • 관리되지 않는 인터페이스 선언에 나타나는 순서대로 Manages 구현의 구성원의 순서를 정확하게 선언해야합니다.

예를 들어 다음은 잘 작동하는 것으로 보입니다

[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 속성 등으로 완료)에서 관리되지 않은 인터페이스를 자체 관리 인터페이스 (Guid 속성 등으로 완료)로 선언하고 싶습니다.

예를 들어, 이것은 작동하지 않는 것 같습니다

[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);
}

대신 나는 다음을 강요해야한다

[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);
}

IE는 회원 주문을 고려하면서 단일 인터페이스로 선언합니다.

그렇다면 관리되지 않은 상대방의 관리 인터페이스를 선언하기위한 지침은 무엇입니까? 어쨌든 내가 원하는 것을 달성 할 수 있는가? 관리 된 측면의 인터페이스 상속 + 멤버를 내가 원하는 순서로 선언합니다 (실제로 알파벳순으로 정렬하고 싶습니다).

도움이 되었습니까?

해결책

당신의 발견은 vtables와 같은 일로 인해 발생합니다. vtable 순서를 변경할 수는 없으며 다른 인터페이스에서 상속되는 인터페이스는 항상 VTable의 모든 기본 항목을 갖습니다. 따라서, 당신이 찾고있는 규칙은 "vtable이 동일하다고 확인하십시오"입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top