회사에서 코어로 되어있는 C++엔진을 C#으로 올리는 작업을 하게 되었습니다.

속도와 최적화를 위해 C++로 만든 라이브러리 같을 것을 생산성을 높이기 위해 C#에서 사용할 수 있습니다 

그 방법은 크게 두가지가 있는데 

첫번쨰는 C++/CLI를 이용해서 넘겨주는 것이고

두 번쨰는 DLLImport 해주는 방법입니다 저희 회사는 모종?의 이유로 첫번째를 사용합니다 

저도 처음 해보는 것 이기에 해보다 오늘 성공! 하고 잊지 않기 위해 포스팅! 첫번째 방법도 라이브러리가 정적,동적 두개가 있기때문에 크게 두가지로 나눌수 있는데

1.C++로만든 Lib ->C++/CLI -> C#

2.C++로만든 Dll -> C++/CLI -> C# 

회사 엔진은 Dll로 배포하기에 일단 2.으로 포스팅을 먼저 하겠습니다.

1.먼저 Dll이 필요합니다. 만약 없다면 하나 만들어봅시다 https://msdn.microsoft.com/ko-kr/library/ms235636.aspx

2.저 예제를 그대로 빌드하고 컴파일 하면

MathFuncsDll.dll

MathFuncsDll.lib

라고 나오는데 이름은 사실 상관없습니다. dll과 Lib 파일만 있으면 됩니다. 아 header 파일도 필요합니다.

3.자 이제 정말 만들어봅시다! 비주얼 스튜디오를 시작하고 파일->새로만들기->프로젝트를 누르고

Visual C++ -> CLR -> 클래스라이브러리를 선택합시다 솔루션 이름과 프로젝트 네임은 전 스샷처럼 했지만 자유롭게 정해봅시다

그러고 확인을 누르면 이렇게 되고 ref class가 자동으로 생성됩니다. 아마 Class1 이라고 나올것 입니다 

저는 파일이름과 맞추어주기위해 이름을 dllClr로 바꾸어 생성했습니다. 

이제 프로젝트의 솔루션이 있는 경로로 가서 dll,lib,h 파일을 '일단' 이 프로젝트 폴더에 넣어줍니다

사실...설정이 더 빡세고 짜증난다 ㅠㅠ 이제 설정을 해봅시다.

먼저 어떤 함수가 무엇을 하는지 알아야 합니다 그걸 알기위해서 헤더파일도 같이 있습니다.

그래서 프로젝트에 헤더파일란에 저 헤더파일을 추가해줍시다. 방금 일단 저 폴더에 넣자고 했는데 지금이야 작은 Dll이지만 나중에 커지면 관리하기 힘드니 지금 폴더를 나누어 줍시다 그래서 저는 include 폴더를 만들어서 헤더파일을 넣어주고 lib 폴더를 만들어서 dll과 lib 파일을 넣어주었습니다

자 아까 나누어주었던 라이브러리를 프로젝트에 추가해 줍시다.

하게 되면 왼쪽 소스 처럼 #include 에서 경로를 입력해주지 않아도 됩니다 

이제 아까 추가해준 헤더파일을 보면서 어떤 함수가 있는지 보면서 C++/CLR로 적어줍니다

소스파일 입니다 dll에 있는 함수를 가져옵니다

라이브러리도 추가해 주어야 하는데요 링커->입력 추가 종속성에서 라이브러리를 등록해줍니다! 주의 하실것은 라이브러리가 있는 폴더가 아니라

xxxx.lib를 직접 등록해 주어야 합니다.

한번 빌드! 네 잘 됩니다!

자 이제 C# 프로젝트를 만들어서  dll에 있는 것들을 가져와서 사용해 봅시다!

 

CLR 도 추가해줍니다. 이렇게 dll을 한번 감싼 것을 C# 프로젝트에서 사용할수 있게 합니다.

프로젝트 오른쪽 클릭 추가 참조를 눌러줍니다

참조관리자에서 솔루션에서 CLR프로젝트를 추가해서 넣어줍니다

CLR은 빌드 만 해주기때문에 그 라이브러리를 사용해서 직접 보여주는 것은 C# 프로젝트가 합니다

때문에 C# 프로젝트를 시작 프로그램으로 설정해 줍니다

여기서 가장 중요한것! 그 맨처음의 dll을 실행 파일이 있는 곳에 넣어주어야 합니다.

CLR이 참조하는 것들을 가져와야 하기떄문에 실행시점에 dll 파일이 있어야 합니다.(이것때문에 2시간 삽질 ㅠㅠ)

obj으로 가져온 dll속에 있는 함수들! 사용해 보면 잘 나옵니다!


ps.혹 실행이 안되신다면 64비트 32비트 맞추기 위해 빌드 에서 32비트 기본 사용을 체크 해제해 주세요

+ Recent posts