C#에서 만든 .DLL 라이브러리를 MFC(C++)에서 사용할려면 .tlb 파일을 생성 및 윈도우즈 레지스트리에 등록하는 과정이 필요하다.

이를 위해서는 MS 제공 RegAsm.exe라는 프로그램을 이용해서 처리를 하게 될텐데(자세한 정보는 여기를 클릭) 이를 위해서 Developer Command Prompt for VS 2017라는 일종의 커맨더 창에서 작업을 하게된다.

이는 개발자가 개발 단계에서는 문제가 되지 않으나 개발된 프로그램을 일반 사용자에게 배포하게 될때는 일반 사용자가 이 작업을 할수는 없는 것이다.

따라서 프로그램상에서 .DLL로부터 .tlb 생성 및 레지스트리 등록을 처리해야 할 것이다.


본 포스트는 C# 코드상에서 이 두 가지 작업을 수행하는 방법에 대해 정리하고자 한다.

C#에서 외부 실행 파일을 실행하는 것 자체는 그렇게 어려운 작업은 아니나 문제는 레지스트리에 뭔가를 쓰게 되는 일은 시스템의 보안상 간단하게 처리되어질수는 없는 일이기에 코드상에서 처리하는 일에 복잡성이 발생하게 된다.

이러한 상황 가운데서 위 2가지 작업을 프로그램적으로 어떻게 처리할수 있는지를 살피고자 한다.


핵심은 프로그램 자체가 '관리자 권한'으로 실행되는 프로그램이어야 한다는 것이다. 이렇게 되어야 코드를 통해서 레지스트리 등록이 가능해 진다.


(1) 관리자 권한으로 실행되는 프로그램 만들기

Visual Studio 2017을 기준으로 설명하면 '솔루션 탐색기' 탭에서 해당 프로젝트 이름위에 마우스 우 클릭 ⇒ 속성 ⇒ 보안 ⇒ "ClickOnce 보안 설정 사용"을 체크 ⇒ 이 상태를 저장(Ctrl-S)



이상의 작업을 거치면 '솔루션 탐색기' 탭의 프로젝트 명 아래의 Properties 항목 아랫쪽에 app.manifest라는 파일이 생성이 된다.

이 파일의 설정 값을 조정함을 통해서 현재의 프로그램이 관리자 권한으로 실행되는 프로그램으로 설정된다.



아래 그림의 노랑색 밑줄친 부분의 level의 값 asInvoker를 requireAdministrator로 변경을 해 준 후 저장을 한다.



Visual Studio 2017을 종료 후 '관리자 권한'으로 새로 시작한다.

(그렇지 않고 현재 상태에서 프로그램을 디버깅(실행)하면 "다른 자격 증명을 사용하여 다시 시작"할 것인지 묻는 창이 뜬다. 이 창이 의미하는 것은 Visual Studio 2017을 관리자 권한으로 다시 실행하겠느냐는 뜻이다.)


프로그램을 디버깅(실행)하면 현재 프로그램의 .exe 실행 파일이 생성이 되고 이 실행 파일은 매 실행시마다 관리자 권한으로 실행 여부를 사용자에게 묻게 된다.


(2) .tlb 파일 생성 및 윈도우즈 레지스트리 등록하는 소스 코드


using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace RegisterTLB

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("This program is registering .TLB to Windows registry.");


            var proc = new ProcessStartInfo();


            // .dll을 이용해서 .tlb생성 및 레지스트리 등록 명령어

            // regasm의 사용법은 DOS창(커맨더 창)에서 regasm /?을 하면 

            // regasm을 아래와같이 이 파일의 경로를 표시하지 않으면 현재의 프로그램의 실행 파일과 같은 위치에

            // regasm.exe가 있어야 된다.

            string mCmd = "regasm EthernetClientLib.dll /tlb:EthernetClientLib.tlb";

            proc.UseShellExecute = true;


            //아래 경로에 .DLL가 있어야하고 .tlb가 이 위치에 생성이 되고 regasm.exe도 이 위치에서

            //작업을 하게된다.

            proc.WorkingDirectory = @"D:\Joe\CSharp\EthernetClientLib\EthernetClientLib\bin\Debug";


            //위의 regasm EthernetClientLib.dll /tlb:EthernetClientLib.tlb를 실행시킬 명령어

            proc.FileName = "cmd.exe";


            //아래 속성의 runas 자체가 관리자 권한으로 실행시키겠다는 설정값이다.

            proc.Verb = "runas";

            proc.Arguments = "/C " + mCmd;

            proc.WindowStyle = ProcessWindowStyle.Hidden;

            Process rt = Process.Start(proc);


            Debug.WriteLine("##### .tlb 생성 및 레지스트리 등록을 마쳤습니다.");

        }

    }

}



+ Recent posts