1. COM은 바이너리 스탠다드이다. 그러나 CLR은 좀더 상위 레벨에서 COM을 보조하는 역활을 한다.

 

2. 그럼에도 CLR은 완벽하지 않아서, 직접 C++과 C#의 갭을 메우는 짓이 필요하다.

using System.Runtime.InteropServices;

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("26e278ff-5641-46da-94b3-1da3f19b315a")]
interface IHen
{
    [PreserveSig] void Cluck();
    [PreserveSig] void Roost();
}

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("06845df9-7bb9-4d72-aaf7-0dc527078806")]
interface IHen2
{
    // IHen
    [PreserveSig] void Cluck();
    [PreserveSig] void Roost();

    // IHen2
    [PreserveSig] void Forage();
}

class Application
{
    static void Main()
    {
        IHen hen = CreateHen();
        hen.Cluck();
        hen.Roost();

        IHen2 hen2 = (IHen2)hen;
        hen2.Forage();
    }

    [DllImport("Library.dll", PreserveSig = false)]
    static extern IHen CreateHen();
}

3. 기존에 사용하던 GUID를 그대로 사용하고, IHen2 인터페이스에서 IHen을 상속 받지 않은 것을 주목한다.

4. HRESULT를 반환하지 않는 이유는 무엇인가?

5. C#에서는 QueryInterface 메소드를 직접 호출할 수 없다.

6. C# 컴파일러를 작동한다.

csc /platform:x86 Appcs.cs

7. 실행한다. C++과 동일하게 동작한다.

'삽질 > COM' 카테고리의 다른 글

Trace  (0) 2020.11.13
Verify  (0) 2020.11.13
COM study note 8 IUnknown 이식  (0) 2020.10.30
COM study note 7  (0) 2020.10.29
COM study note 6 인터페이스 상속  (0) 2020.10.28
복사했습니다!