WinForms나 다른 프레임워크에 종속성을 갖지 않는 ActiveX, COM 호스트 라이브러리

다른 프레임워크에 대한 종속성 없이 키움증권의 API를 사용하기 위해 만들었다가 C#에서 ActiveX나 COM을 사용하고 싶은 사람에게 유용할거 같아서 작성합니다.

기존에 C#에서 ActiveX 컨트롤을 호스트 하려면 다음과 같이 해야했습니다.

public sealed class KiwoomNativeClient : System.Windows.Forms.AxHost
{
    // ...
}

public static KiwoomNativeClient CreatetClient()
{
    var tcs = new TaskCompletionSource<KiwoomNativeClient>();

    var thread = new Thread(Run) { IsBackground = true };
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

    return tcs.Task.Result;

    void Run()
    {
        try
        {
            var kiwoomNativeClient = new KiwoomNativeClient();

            // Initialize the kiwoomNativeClient.
            _ = new System.Windows.Forms.Form { Controls = { kiwoomNativeClient } };
            _ = kiwoomNativeClient.Handle;

            tcs.SetResult(kiwoomNativeClient);

            System.Windows.Forms.Application.Run();
        }
        catch (Exception exception)
        {
            tcs.SetException(exception);
        }
    }
}

FluentActiveX library는 Win32 API와 ATL을 이용하여 기존의 WinForms에 대한 종속성을 제거하고 다음과 같이 코드를 단순화 할 수 있습니다.

public sealed class KiwoomNativeClient : FluentActiveX.ActiveXHost<IKiwoomNativeClientMethods>
{
    // ...
}

public static KiwoomNativeClient CreateClient()
{
    return new KiwoomNativeClient();
}
2 Likes