(연관된 글이 1개 있습니다.)
C++ 에서 C# DLL 을 연동하는데 문제가 있어서 질문 드립니다.
저는 성태님의 블로그를 보고 저의 로컬 PC에서 아래 과정을 거치면서 연동을 성공했습니다.
1. C# DLL 클래스 라이브러리 생성
2. C# DLL 을 regasm을 이용해 tlb 파일생성
3. C++ 에서 C# DLL 호출 가능한 상태
하지만 제 2번째 문제는 위와같은 시퀀스를 가진 C++ exe파일을 실제로 다른 PC에서 실행시키면 CoCreateInstance 에서 오류가 발생합니다.
(현재상태 : exe(c++) -> Load dll(c++) -> Load dll(C#) 이거와 같이 C++ exe에서 c++ dll을 로드하고 해당 C++ dll 에서 C# api를 호출하는 시퀀스입니다.)
또한 저는 이 오류가 나는 이유를 알기 위해서 여러가지 테스트를 했습니다.
1. C# 코드를 빌드한 PC에서 regasm 명령어를 이용해 tlb 파일을 생성하면 오류가 발생하지 않습니다.
2. C# 코드를 빌드하지 않은 PC에서 빌드한 dll파일만 가지고 와서 regasm 명령어를 사용해 tlb를 생성하면 오류가 발생합니다.
속성 : C# 에서의 속성은 "어셈블리를 com에 노출" 과 "com interop 등록" 을 체크해서 빌드했습니다.
문제 : C# 코드를 컴파일하면서 어떤 동작을 하는 것 같습니다만, 이 동작이 어떤 동작을 하는지 정확하게 모르겠습니다.
결론 : 저는 C# DLL 을 가지고 C++ 에서 사용하도록 하고 싶습니다. 하지만 C# DLL 만을 가지고서 다른 PC Regasm 명령어를 수행해도 오류가 발생합니다
======================================= C++ Code ================================================
seongtaekInterFace *cpi = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_seongtaekClass, NULL, CLSCTX_INPROC_SERVER,IID_seongtaekInterFace, reinterpret_cast<void**>(&cpi)); -> 오류발생지점
SHOW_DEBUG(("seongtaek10.oh hr = %d , error = %d",hr,GetLastError())); -> hr을 값으로 찍으면 -2147024894 가 출력됩니다.
-> GetLastError() 는 0을 출력합니다. ㅠㅠ
if(SUCCEEDED(hr))
{
SHOW_DEBUG(("seongtaek10.oh IN Succeeded"));
int result = cpi->Printing(g_wszFullPath);
}
else
{
SHOW_DEBUG(("seongtaek10.oh Error %d",GetLastError()));
g_bRePrintFlag = FALSE;
}
======================================= C++ Code End ================================================
C# 코드는 아래 코드가 전부입니다 매우 짧습니다.
저는 프린트를 위해 아래와 같이 요청한 것입니다.
======================================= C# Code Start ================================================
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace seongtaek10oh
{
[Guid("16EA1A39-4246-44C1-AA60-A9C8B9DB55BA")]
public interface seongtaekInterFace
{
void Printing(string filepath);
}
[Guid("54C3B292-27AC-4F23-9F1D-6FB0CBBFCE26")]
public class seongtaekClass : seongtaekInterFace
{
public void Printing(string filepath)
{
ProcessStartInfo temp = new ProcessStartInfo(filepath);
temp.Verb = "print";
temp.CreateNoWindow = true;
Process.Start(temp);
}
}
}
======================================= C# Code End ================================================
[연관 글]
[최초 등록일: ]
[최종 수정일: 8/19/2021]