기본적으로 ASP.NET Core는 클래스와 해당 종속성 간의 IoC(Inversion of Control)를 실현하는 기술인 DI(종속성 주입) 소프트웨어 디자인 패턴을 지원1한다.
Desktop 애플리케이션 개발에 자주 사용하는 WPF는 개발자가 직접 작성하여 추가하거나 또는 MVVM 패턴을 지원하는 Caliburn.Micro2와 같은 프레임워크를 사용하여 DI(종속성 주입) 환경을 구축한다.
WPF를 이용한 개발에 DI를 적용하는 기본적인 환경 구성을 Microsoft.Extensions.Hosting 패키지를 이용(IHost Interface3)하여 구축할 수 있다.
<Application x:Class="ExamHelloDI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- StartupUri="MainWindow.xaml" : 기본값 제거-->
<Application.Resources>
</Application.Resources>
</Application>
C# Interop with C/C++ 주제로 Native DLL을 C#에서 호출하여 사용하는 예1를 살펴보았는데 이번 주제는 Delphi DLL 파일을 C#에서 사용하는 예제를 작성해보았다. 모두 64bit로 빌드하였고 사용한 .NET 버전은 5.0이다. 예제에 사용한 소스 중 일부는 programmerall.com2에서 참고하였다.
library TestLib;
uses
System.SysUtils, System.Classes, System.AnsiStrings;
{$R *.res}
function GetResultP(inputString: PAnsiChar): PAnsiChar; stdcall; export;
var
pstr: PAnsiChar;
begin
pstr := PAnsiChar(AnsiString(' : 가나닭'));
Result := System.AnsiStrings.StrCat(inputString, pstr);
end;
function GetResult(inputStirng: PChar): PChar; stdcall; export;
var
str: PChar;
begin
str := PChar(' : 마바삵');
Result := StrCat(inputStirng, str);
end;
exports GetResultP, GetResult;
begin
end.
클래스의 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴(Singleton pattern)이라고 한다1. 정적 클래스(Static Class)와 비교해 싱글턴은 인터페이스 구현, 비동기 지원2 등 OOP에 더 어울리는 장점3을 가지고 있다.
Winform 응용프로그램에서 단일 인스턴스를 유지하고 이에 따라 하위 Winform이 프로그램 종료 시점까지 그 상태를 유지하기 원한다면 Winform을 싱글턴 패턴으로 만들어 사용하면 된다. 즉 하위 폼을 호출할 때 새로운 인스턴스(new)가 생성되는 것을 방지하고 처음에 생성한 폼을 지속해서 유지할 때 유용하다. 더욱 자세한 소스는 여기(github)에서 볼 수 있다.
using System;
using System.Windows.Forms;
namespace WinFormsApp
{
internal static class Program
{
[STAThread]
private static void Main()
{
// https://docs.microsoft.com/dotnet/api/system.windows.forms.highdpimode
// DpiUnaware, DpiUnawareGdiScaled, PerMonitor, PerMonitorV2, SystemAware
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
Application.EnableVisualStyles(); // Theme Enable
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(FormMain.Go); // Singleton Form
}
}
}