다른 프레임워크에 대한 종속성 없이 키움증권의 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();
}