안녕하세요?
질문이 있어 글 남깁니다.
목적 :
C#을 이용해 만든 dll 을
EXCEL 에서 사용할려고 합니다.
수작업으로 아래와 같이 실행해 주면 사용이 가능해 집니다.
1. 해당 dll 파일을 사용자의 컴퓨터에 저장
2. RegAsm.exe 파일이 있는 경로에서 명령프롬프트 실행(관리자 권한으로)
3. 아래 명령문 실행
C:\Program Files (x86)\...path...\Tools>RegAsm /codebase C:\DLL\ExcelTest.dll
수작업으로 배포하는 부분을 자동화하고 싶습니다.
즉 C#으로 프로젝트를 만들어서 사용자의 컴퓨터에서 setup.exe를 실행하면 dll 을 사용할 수 있게 하고 싶습니다.
감사합니다
-----------------------------------------------------------------------------------
ExcelTest.dll 은 Resources 폴더에 추가한 상태고 빌드 작업을 [포함 리소스]로 설정한 상태입니다.
ExcelTest.dll 소스코드
namespace ExcelTest
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CSharpTools
{
[ComVisible(true)]
public string AddBrackets(string value)
{
return "[" + value + "]";
}
}
}
DLL 배포하기 위해 작업한 소스 코드
using System;
using System.Diagnostics;
using System.IO;
using System.Security.Principal;
using System.Windows.Forms;
namespace RegisterTest
{
static class Program
{
/// <summary>
/// 해당 응용 프로그램의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
//ClickOnce - 관리자 권한 상승하는 방법
//출처 :
https://www.sysnet.pe.kr/2/0/950
if (IsAdministrator() == false)
{
try
{
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.UseShellExecute = true;
procInfo.FileName = Application.ExecutablePath;
procInfo.WorkingDirectory = Environment.CurrentDirectory;
procInfo.Verb = "runas";
Process.Start(procInfo);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
return;
}
// 컴파일 배포시 단이 exe 로 배포하고 , 참조하는 dll은 리소스 파일에 추가하여 (참조리소스)
// 단일 실행파일로 만들어 배포함.
// 프로그램은 실행시 참조 dll 파일을 생성하고 리소스 파일에 있는 원 파일을 읽어서 대체함.
string strDllPath = "";
string strFullFileName = "";
try
{
strDllPath = Application.ExecutablePath.Replace("/", "\\");
int intPos = strDllPath.LastIndexOf("\\");
if (intPos >= 1)
strDllPath = strDllPath.Substring(0, intPos).Trim('\\');
strFullFileName = strDllPath + "\\ExcelTest.dll";
FileInfo fileinfo = new FileInfo(strFullFileName);
if (fileinfo.Exists == false)
{
byte[] aryData = Resource1.ExcelTest; //리소드 디자인에 저장한 이름
FileStream fileStream = new FileStream(fileinfo.FullName, FileMode.CreateNew);
fileStream.Write(aryData, 0, aryData.Length);
fileStream.Close();
}
// 출처:
https://lovelypang.tistory.com/73 [코코몽과 토토몽]
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
// dll 파일 레지스트리에 등록하기
// 출처:
https://developer-joe.tistory.com/148
try
{
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 ExcelTest.dll /tlb:ExcelTest.tlb";
string mCmd = "regasm ExcelTest.dll /tlb:ExcelTest.tlb";
proc.UseShellExecute = true;
//아래 경로에 .DLL가 있어야하고 .tlb가 이 위치에 생성이 되고 regasm.exe도 이 위치에서
//작업을 하게된다.
proc.WorkingDirectory = @strDllPath;
//위의 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 생성 및 레지스트리 등록을 마쳤습니다.");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
}
}
}
-----------------------------------------------------------------------------------
참고한 사이트
C# 코드상에서 .tlb 생성 및 레지스트리 등록하는 법
https://developer-joe.tistory.com/148
regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (1) - .NET 2.0 + x86/x64/AnyCPU
;
https://www.sysnet.pe.kr/2/0/1286
regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (2) - .NET 4.0 + .NET 2.0
;
https://www.sysnet.pe.kr/2/0/1287
regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (3) - Type Library
;
https://www.sysnet.pe.kr/2/0/1288
[최초 등록일: ]
[최종 수정일: 4/9/2019]