반응형

Interop(Interoperability)는 서로 다른 프로그래밍 언어, 플랫폼, 기술 등 간의 상호 운용성을 지원하는 기술입니다. 특히, .NET 언어에서 Interop은 다른 플랫폼이나 라이브러리 등을 사용할 수 있도록 하는 방법을 제공합니다.

Interop은 COM(Component Object Model)과 관련된 기술로 시작되었습니다. COM은 Microsoft에서 개발한 프로그래밍 모델로, 다른 프로그래밍 언어나 플랫폼에서 COM 구성 요소를 사용할 수 있도록 하는 Interop 기술을 제공합니다. 이후 .NET Framework가 등장하면서 Interop 기술은 COM 뿐만 아니라 다른 플랫폼, 기술과도 상호 운용성을 지원하게 되었습니다.

Interop은 Windows 운영 체제에서 사용되는 외부 binary와 상호 작용할 수 있도록 해주는 기술입니다. Interop은 COM Interop, P/Invoke 및 C++ Interop을 포함한 .NET Framework의 다양한 상호 운용 기술을 일컫는 말입니다. 따라서 P/Invoke는 Interop 기술 중 하나입니다.

P/Invoke와 COM Interop은 각각 다른 방식으로 Interop을 지원합니다. P/Invoke는 C/C++ 함수를 선언하고, 해당 함수를 호출하는 방식으로 상호 운용성을 지원합니다. COM Interop은 COM 구성 요소를 .NET 언어에서 사용할 수 있는 클래스로 래핑하여 상호 운용성을 지원합니다.

COM Interop의 주요 용도로서 Microsoft Office 제품군과의 상호 운용성이 있습니다. C#과 같은 .NET Framework 언어로 작성된 애플리케이션에서 Microsoft Word 문서를 조작하려면, COM Interop을 사용하여 Word의 COM 객체 모델에 액세스해야 합니다.

COM Interop을 사용하여 Word와의 상호 운용성을 지원하는 코드 예제는 다음과 같습니다.

using Word = Microsoft.Office.Interop.Word;

// Word Application 인스턴스 생성
Word.Application wordApp = new Word.Application();

// Word Document 인스턴스 생성
Word.Document wordDoc = wordApp.Documents.Add();

// Document 내용 수정
Word.Paragraph para1 = wordDoc.Content.Paragraphs.Add();
para1.Range.Text = "Hello, World!";

// Document 저장
wordDoc.SaveAs2("C:\\Temp\\Hello.docx");

// Word 종료
wordDoc.Close();
wordApp.Quit();


P/Invoke는 Platform Invocation Services의 약자로, .NET Framework에서 C# 또는 다른 .NET 언어로 C/C++ 외부 DLL 함수를 호출하는 방법을 제공합니다. 즉 P/Invoke를 사용하여 Win32 API를 포함한 C/C++ DLL 함수를 호출할 수 있으며, 이를 통해 .NET으로 개발되지 않은 기존의 많은 DLL의 기능을 활용할 수 있습니다.

P/Invoke는 외부 DLL 함수를 호출하기 위해 일반적으로 DllImport 어트리뷰트를 사용합니다. DllImport 어트리뷰트는 해당 DLL 파일과 함수의 이름을 지정하고, 필요한 경우 함수 매개변수 및 반환 값에 대한 정보를 제공합니다.

예를 들어, C#에서 Win32 API 함수 중 MessageBox 함수를 호출하려면 다음과 같이 DllImport 어트리뷰트를 사용하여 함수 이름을 지정하고, 필요한 경우 함수 매개변수 및 반환 값에 대한 정보를 제공해야 합니다.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern MessageBoxResult MessageBox(IntPtr hWnd, string text, string caption, uint type);

P/Invoke를 사용할 때는 또한 해당 함수의 호출 규약(calling convention)과 매개변수의 전달 방식 등을 고려해야 합니다. 대부분의 DLL 함수는 C 언어 기반으로 작성되므로, C calling convention을 사용하며, 일부 함수는 STDCALL calling convention을 사용합니다.

P/Invoke를 사용하여 C/C++ DLL 함수를 호출할 때는 함수 매개변수 및 반환 값의 자료형이 호환되어야 합니다. 예를 들어, C#에서 int 자료형은 C/C++에서 int 자료형과 호환되지만, string 자료형은 C/C++에서 wchar_t 배열과 호환되므로 이에 대한 변환 작업이 필요합니다.

이 때 호출하는 함수와 .NET 언어 간에 데이터 형식이 다른 경우에는 마샬링(marshaling) 기술이 사용됩니다.

마샬링은 서로 다른 프로그래밍 언어나 환경에서 데이터를 주고받을 때 데이터의 형식을 변환하는 과정입니다. P/Invoke에서도 호출하는 함수와 .NET 언어 간에 데이터 형식이 다른 경우에는 이를 변환하는 마샬링 기술이 사용됩니다. P/Invoke에서는 이러한 마샬링 과정을 자동으로 처리해주는 기능을 제공하며, 일부 자료형의 경우에는 사용자가 직접 변환 과정을 처리해주어야 합니다.

참고로 P/Invoke를 위한 Win32 API의 메소드 원형을 쉽게 작성하기 위해서는 pinvoke.net 사이트를 이용하면 편리 합니다.

반응형

'개발정보' 카테고리의 다른 글

RCW(Runtime Callable Wrapper)란  (0) 2023.03.21
COM 구성 요소란  (0) 2023.03.20
[C#] params 키워드  (0) 2023.02.15
[C#] Initializer(이니셜라이저)의 종류와 사용법  (0) 2023.02.13
[C#] 객체 초기화  (0) 2023.02.13

+ Recent posts