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 |