반응형

NSIS 로 설치파일을 만들 때, .Net Framework이 설치되어 있지 않은 구형 PC에서 자동으로 다운로드 및 설치가 필요한 경우가 있습니다.

물론 별도로 수동설치 하면 되겠지만 아무래도 자동으로 해당 기능이 포함되어 있으면 사용자 입장에서는 더 편리하겠죠?

다음은 .Net Framework 4.7.2 가 시스템에 없다면 다운로드 해서 설치까지 되도록 하는 부분 입니다.

Section
    Call CheckDotNetFramework
SectionEnd

Function CheckDotNetFramework
    ; .NET Framework 4.7.2를 확인합니다.
    ; Release DWORD 값은 https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#find-net-framework-versions-by-viewing-the-registry 에서 찾을 수 있습니다.
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
    IfErrors install
    IntCmpU $0 461808 install ; 461808은 .NET Framework 4.7.2의 Release 키 값입니다.
    Goto done
install:
    DetailPrint ".NET Framework 4.7.2를 다운로드하고 있습니다..."
    ; .NET Framework 4.7.2 설치파일을 다운로드합니다.
    nsisdl::download "https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0fd66638cde16859462a6243a4629a50/ndp48-x86-x64-allos-enu.exe" "$TEMP\dotNetFx47_Full_setup.exe"
    IfErrors downloadFailed
    DetailPrint ".NET Framework 4.7.2를 설치하고 있습니다..."
    ; .NET Framework 4.7.2를 설치합니다.
    ExecWait '"$TEMP\dotNetFx47_Full_setup.exe" /q /norestart' $0
    IfErrors installFailed
    Delete "$TEMP\dotNetFx47_Full_setup.exe"
    Goto done
downloadFailed:
    MessageBox MB_OK|MB_ICONSTOP "Failed to download .NET Framework 4.7.2."
    Abort
installFailed:
    MessageBox MB_OK|MB_ICONSTOP "Failed to install .NET Framework 4.7.2."
    Abort
done:
FunctionEnd

 

반응형

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

PIA(Primary Interop Assembly) 란?  (0) 2023.03.21
COM 개체와 타입 라이브러리(Type Library)  (0) 2023.03.21
RCW(Runtime Callable Wrapper)란  (0) 2023.03.21
COM 구성 요소란  (0) 2023.03.20
[.net] interop 과 p/invoke  (0) 2023.03.20
반응형

PIA .NET 프레임워크가 처음 도입된 2000년대 초반 이후부터 존재해 온 기술 입니다. 이 글을 통해 PIA에 대한 기본 개념을 익히고, 예제 소스를 통해 실제로 어떻게 사용되는지 알아보겠습니다.

1.   Primary Interop Assembly(PIA)?

Primary Interop Assembly(PIA)는 마이크로소프트에서 제공하는 기술로, .NET 어플리케이션에서 COM 기반의 컴포넌트를 사용할 수 있게 도와주는 역할을 합니다. 여기서 COM(Component Object Model)은 마이크로소프트에서 개발한 프로그래밍 인터페이스로, 개발자들이 객체 지향 프로그래밍을 통해 모듈화된 소프트웨어를 개발할 수 있도록 도와줍니다.

간단히 말해, PIA .NET 환경에서 COM 기반의 컴포넌트를 사용할 수 있게 해주는 "다리" 역할을 하는 것입니다.

2.   PIA가 필요한가?

그렇다면 왜 PIA가 필요할까요? 이는 .NET COM 기반 컴포넌트 간에 런타임 환경의 차이 때문입니다. .NET은 고유의 런타임 환경인 CLR(Common Language Runtime)을 사용하며, COM 기반 컴포넌트는 Win32 기반의 네이티브 런타임 환경을 가지고 있습니다. 이러한 차이로 인해 두 시스템 간에 직접적인 통신이 어렵습니다. 따라서 PIA를 사용하여 .NET COM 간의 통신을 원활하게 만들어주는 것이 필요한 것입니다.

3.   PIA 작동 원리

앞서 말한 바와 같이 PIA .NET 어플리케이션에서 COM 기반 컴포넌트를 사용할 수 있게 해주는 "다리" 역할을 합니다. 이는 COM Callable Wrapper (CCW) Runtime Callable Wrapper (RCW) 두 가지 방식으로 이루어집니다.

  • COM Callable Wrapper (CCW): .NET에서 개발된 객체를 COM 기반 컴포넌트가 호출할 수 있도록 해주는 기능입니다.
  • Runtime Callable Wrapper (RCW): COM 기반 컴포넌트를 .NET 어플리케이션에서 호출할 수 있도록 해주는 기능입니다.

4.   PIA 생성 및 참조

PIA는 특별한 형태의 어셈블리로, COM 컴포넌트의 메타데이터를 포함하며 이를 .NET 환경에서 사용할 수 있도록 해줍니다. PIA를 생성하려면 먼저 COM 컴포넌트의 타입 라이브러리(Type Library) .NET 어셈블리로 변환해야 합니다. 이를 위해 마이크로소프트에서 제공하는 Type Library Importer(tlbimp.exe) 도구를 사용할 수 있습니다.

예를 들어, COM 컴포넌트인 Microsoft Excel PIA를 생성하려면 다음 명령을 실행합니다. 

tlbimp.exe "C:\Path\To\Excel.tlb" /out:"C:\Path\To\Output\Microsoft.Office.Interop.Excel.dll"

명령을 실행한 후, 생성된 PIA .NET 프로젝트에 참조해야 합니다. Visual Studio에서 참조를 추가하는 방법은 다음과 같습니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후, '참조 추가'를 선택합니다.
  2. '찾아보기' 탭을 클릭한 후, 생성된 PIA dll 파일을 찾아 선택합니다.
  3. '확인'을 클릭하여 참조를 추가합니다.

경우에 따라 COM 컴포넌트 제작 업체에서 해당 제품에 대한 공식 PIA를 제공할 수 있습니다. 이러한 PIA는 COM 컴포넌트와의 통합이 잘 이루어지도록 최적화되어 있을 수 있으며, 업체에서 지원되는 방식으로 사용하는 것이 좋습니다.

또한 Visual Studio에서는 "참조 추가" 대화상자를 통해 COM 컴포넌트를 선택함으로써, 자동으로 해당 COM 컴포넌트(구성요소)에 대한 런타임 호출 가능 래퍼(Runtime Callable Wrapper, RCW)가 생성됩니다. 이 RCW는 PIA와 비슷한 역할을 수행합니다.

Visual Studio에서 COM 컴포넌트를 참조하려면 다음과 같이 합니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후, '참조 추가'를 선택합니다.
  2. 'COM' 탭을 클릭한 후, 원하는 COM 컴포넌트를 선택합니다.
  3. '확인'을 클릭하여 참조를 추가합니다.

이렇게 하면, COM 컴포넌트를 사용할 수 있는 인터페이스가 포함된 interop 어셈블리가 자동으로 생성되고 프로젝트에 추가됩니다. 이 interop 어셈블리는 PIA와 유사한 기능을 수행하며, 프로젝트에서 COM 컴포넌트의 기능을 사용할 수 있게 합니다.

5.   예제 소스

아래 예제에서는 .NET에서 COM 기반 컴포넌트를 사용하는 방법을 살펴보겠습니다. 이 예제에서는 마이크로소프트 엑셀(Microsoft Excel) COM 기반 컴포넌트로 사용합니다.

using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelInteropExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 엑셀 애플리케이션 객체 생성 (PIA를 사용하여 COM 컴포넌트를 호출)
            Excel.Application excelApp = new Excel.Application();
            // 엑셀 파일을 새로 생성하거나 기존 파일을 열기
            Excel.Workbook workbook = excelApp.Workbooks.Add();
            Excel.Worksheet worksheet = workbook.ActiveSheet;

            // 셀에 데이터 입력
            worksheet.Cells[1, 1] = "Hello";
            worksheet.Cells[1, 2] = "World";

            // 엑셀 파일 저장
            workbook.SaveAs("C:\\Path\\To\\Output\\Sample.xlsx");

            // 엑셀 애플리케이션 및 워크북 종료
            workbook.Close();
            excelApp.Quit();

            // COM 객체 메모리 해제
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

            Console.WriteLine("Excel file created successfully!");
        }
    }
}

PIA와 관련된 기술들은 지속적으로 발전하고 있으며, 이에 따라 개발자들이 상호 운용성을 확보하는 데 필요한 노력이 점점 줄어들고 있습니다. 예를 들어, .NET Core와 .NET 5에서는 COM 호스트를 통해 PIA 없이도 COM 기반 컴포넌트를 사용할 수 있게 되었습니다. 이러한 발전을 통해 앞으로 상호 운용성이 더욱 간편하고 효율적으로 구현될 것으로 예상됩니다.

 

반응형

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

[NSIS] .Net Framework 설치 포함  (0) 2023.07.07
COM 개체와 타입 라이브러리(Type Library)  (0) 2023.03.21
RCW(Runtime Callable Wrapper)란  (0) 2023.03.21
COM 구성 요소란  (0) 2023.03.20
[.net] interop 과 p/invoke  (0) 2023.03.20
반응형

COM(Components Object Model, COM)은 마이크로소프트에서 개발한 소프트웨어 컴포넌트 기술로, 다른 소프트웨어에서 사용할 수 있는 기능을 제공하는 객체지향 프로그래밍 모델입니다. COM 개체는 이식성이 좋고, 다른 프로그램과 상호작용할 수 있는 인터페이스를 제공합니다. 일반적으로 COM 개체는 DLL(Dynamic-Link Library) 파일 혹은 EXE(Executable) 파일에 구현될 수 있습니다. 

타입 라이브러리(Type Library)는 COM 개체가 제공하는 인터페이스와 메서드, 프로퍼티 등의 정보를 포함하는 라이브러리입니다. 이 정보를 바탕으로 개발자들은 다른 프로그램에서 COM 개체를 사용할 때 필요한 코드를 작성할 수 있습니다. 타입 라이브러리는 주로 TLB 확장자를 갖는 별도의 파일에 저장됩니다.

COM 개체와 타입 라이브러리는 서로 밀접한 관계를 갖습니다. COM 개체를 만들 때에는 해당 개체가 제공하는 인터페이스와 메서드 등을 타입 라이브러리에 정의하고 등록해야 합니다. 그리고 다른 프로그램에서 COM 개체를 사용할 때에는 해당 개체의 타입 라이브러리를 참조하여 개체의 인터페이스와 메서드를 호출합니다.

따라서 COM 개체와 타입 라이브러리는 서로 보완적인 역할을 수행합니다. COM 개체는 기능을 제공하고, 타입 라이브러리는 해당 개체의 인터페이스와 메서드 등을 정의하여 개발자들이 COM 개체를 사용할 수 있도록 도와줍니다.

비유하자면 타입 라이브러리는 COM 개체에 대한 메뉴판이라고 할 수 있습니다. 메뉴판을 보면 어떤 음식이 있는지, 그 음식이 어떻게 만들어졌는지, 어떤 재료로 만들어졌는지 등에 대한 정보를 얻을 수 있습니다. 마찬가지로 타입 라이브러리를 보면 COM개체에 어떤 인터페이스와 메서드가 있는지, 그 인터페이스와 메서드, 프로퍼티 등을 어떻게 사용해야 하는지, 어떤 인자를 전달해야 하는지 등에 대한 정보를 얻을 수 있습니다.

따라서 개발자들은 타입 라이브러리를 참조하여 COM 개체의 인터페이스와 메서드 등에 대한 정보를 얻고, 이를 바탕으로 COM 개체를 사용하는 코드를 작성할 수 있습니다.

반응형

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

[NSIS] .Net Framework 설치 포함  (0) 2023.07.07
PIA(Primary Interop Assembly) 란?  (0) 2023.03.21
RCW(Runtime Callable Wrapper)란  (0) 2023.03.21
COM 구성 요소란  (0) 2023.03.20
[.net] interop 과 p/invoke  (0) 2023.03.20
반응형

런타임 Callable Wrapper(RCW)는 COM(Component Object Model) 기술을 사용하여 .NET 언어와 같은 매니지드 언어에서 COM 개체를 호출할 때 사용되는 개체입니다.

COM 개체는 C++과 같은 비매니지드 언어로 작성되며, 매니지드 언어에서 직접 호출할 수 없습니다. 따라서 RCW는 COM 개체와 매니지드 언어 간의 인터페이스 역할을 합니다. RCW는 COM 개체에 대한 참조를 포함하며, 해당 개체를 호출하기 위해 필요한 래퍼 코드를 생성합니다.

RCW는 .NET에서 COM 개체를 사용할 때 중요한 역할을 합니다. RCW를 사용하면 매니지드 코드에서 COM 개체를 사용하기 쉬워지며, COM 개체와 .NET 런타임 간의 상호 운용성을 개선할 수 있습니다. 또한 RCW는 .NET 언어에서 COM 개체를 사용하기 위해 필요한 다양한 기능, 예를 들어 자동 메모리 관리 및 예외 처리와 같은 기능을 제공합니다.

RCW는 .NET Framework에서 제공하는 기능 중 하나이며, 개발자가 직접 만들 필요가 없습니다. RCW는 .NET에서 COM 개체를 사용하기 위해 필요한 인터페이스를 런타임에 해당 개체에 대한 인스턴스를 생성할 때마다 동적으로 자동으로 생성합니다. 

RCW가 동적으로 생성되는 이유는 COM 개체가 .NET Framework의 메모리 관리와 스레딩 모델과 다르게 동작하기 때문입니다. RCW는 .NET Framework에서 COM 개체를 호출하기 위해 필요한 래퍼 코드를 생성하며, 이를 통해 .NET Framework와 COM 개체 간의 상호 작용을 보다 효율적으로 처리할 수 있습니다.

RCW는 가비지 컬렉션 처리도 담당합니다. 해당 COM 개체가 더 이상 필요하지 않은 경우, RCW는 개체에 대한 참조를 해제하고 메모리를 해제합니다.

반응형

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

PIA(Primary Interop Assembly) 란?  (0) 2023.03.21
COM 개체와 타입 라이브러리(Type Library)  (0) 2023.03.21
COM 구성 요소란  (0) 2023.03.20
[.net] interop 과 p/invoke  (0) 2023.03.20
[C#] params 키워드  (0) 2023.02.15

+ Recent posts