본문 바로가기

Language & API/C#

C++ MFC DLL을 C#에서 로딩하기

MFC DLL 에서 C#을 로딩하기 위해 다음과 같이 옵션을 세팅했다. 

MFC에서 DLL을 만드는 방법은 아래와 같이 3가지가 있습니다. 

1. 공유 MFC DLL을 사용하는 기본 DLL(동적으로 MFC에 링크하는 기본 DLL)  

  - 이 DLL은 Visual C++ 4.0에서 도입된 새로운 형식의 DLL입니다.

  - C, C++, 파스칼, Visual Basic 등 DLL 사용을 지원하는 모든 언어로 클라이언트 실행 파일을 만들 수 있으며 

    이 실행 파일은 MFC 응용 프로그램이 아니어도 됩니다.

  - 정적으로 링크되는 기본 DLL과 달리 이 형식의 DLL은 공유 MFC DLL이라고도 하는 MFC DLL에 동적으로 링크됩니다.

  - 이 형식의 DLL에 링크된 MFC 가져오기 라이브러리는 확장 DLL 또는 MFC DLL인 MFCxx(D).lib를 사용하는 응용 프로그램에 사용되는 것과 동일합니다.

2. 정적 MFC DLL을 사용하는 DLL

3. 확장 DLL


관련된 내용은 MSDN https://msdn.microsoft.com/ko-kr/library/9se914de(v=vs.120).aspx#_core_which_kind_of_dll_to_use 를 참조하면 됩니다. 

참고로 속성 페이지 세팅시 (정적 라이브러리에서 MFC 사용 + 공용 언어 런타임 지원)은 컴파일 에러가 나왔습니다. 

그리고 동적 라이브러리에서 MFC 사용시에는 몇가지 DLL을 같이 배포 해야 한다고 하는데 이부분은 테스트를 해보아야 합니다. 

일단 아래 제가 테스트해 본 세팅 화면입니다. 

그리고 하나 더 세팅 옵션을 설정해야 합니다. 이부분 때문에 C#에서 컴파일 에러가 발생한 하였습니다. ㅠ.ㅠ  네이버 구글을 얼마나 찾았는지... 

그리고 소스 부분은 일단 함수 호출 시도 부분입니다. 클래스는 CLR로 변경해서 해야할 것 같은데 아직 성공하지 못했습니다. 

main.c(MFC DLL)

main.h(MFC DLL)

form1.cs(C#)


CLR로 컴파일하면 C#에서 위에와 같이 참조 부분에 DLL을 넣을 수 있습니다. 

그리고 생성된 DLL을 놓는 위치입니다.  위치를 변경해서 로딩할 수 있으면 좋으려만 아직 방법은 알지 못합니다.

아래 로딩 위치 관련된 순서입니다. 

  -  1. 현재 프로세스의 실행 모듈이 있는 디렉터리

  -  2. 현재 디렉터리

  -  3. Windows 시스템 디렉터리. GetSystemDirectory 함수가 이 디렉터리의 경로를 검색합니다.

  -  4. Windows 디렉터리. GetWindowsDirectory 함수가 이 디렉터리의 경로를 검색합니다.

  -  5. PATH 환경 변수에 나열된 디렉터리



실행 파일이 생성된곳에 DLL을 넣어 호출 하니 잘 되었습니다. 


일단 무진장 간단한 방법(삽질은 많이 했음)으로 테스트 해보았습니다. 좀더 나은 방법은 내공을 더 쌓고 적도록 하겠습니다.

 

'Language & API > C#' 카테고리의 다른 글

윈도우 폼 디자이너가 사라졌을 때(나의 경우)  (0) 2022.10.21