c# 뉴비를 위한 맛보기 2

19
C# 맛보기 2 C++에서 만든 DLL을 어떻게 C#에서 쓸 것인가

Upload: -

Post on 17-Jul-2015

242 views

Category:

Software


7 download

TRANSCRIPT

C# 맛보기 2C++에서 만든 DLL을 어떻게 C#에서 쓸 것인가

들어가기 전에

• 미리 알아야 할 것• C++ DirectX 프로젝트 만들기

• C++ DLL 만들기

• 별로 안 어렵습니다!

C++ DLL 프로젝트 만들기

설정을 이렇게 맞춰줍니다

DLL 파일을 만들 것이고

추가 옵션에서 내보내기 기호를 골라줍니다

C++ DLL 프로젝트 만들기

DX SDK가 미리 설치되어야 합니다

경로를 추가해줍니다

C++ DLL 프로젝트 만들기

링커추가 종속성

d3d9.lib

d3dx9d.lib

dxerr.lib

dxguid.lib

winmm.lib

얘네들을 추가해줍니다

DirectX Tutorial 중에서 아무 거나…

• 소스를 Copy & paste 해 줍니다• 물론 직접 짜셔도 됩니다

헤더 파일을 바꿔야 합니다

기본 설정은 #ifdef로 되어있는데

일단 싹 지우신 다음

extern “C” 를 사용합니다

선언한 함수들은 아까 cpp파일에서

구현한 함수입니다

당연히 리턴 타입과 인자도

일치해야 합니다

그리고 DLL을 통해 공유하고 싶은

함수들만 선언해야 합니다여기선 테스트를 위해 모든 함수를 집어넣었습니다

컴파일을 한 번 해 볼까요?

잘 됩니다

여기서 막히면 다음 과정이 불가능합니다

C# 프로젝트 만들기

C++ 프로젝트가 있는 솔루션에다가

C# 프로젝트를 추가시켜줍니다!

C# 프로젝트 만들기

1

2

3

생성된 C# 프로젝트를 우클릭

속성

빌드

출력

항목으로 가 봅니다.

C# 프로젝트 만들기

이렇게 고쳐줍니다

C++에서 나온 DLL 파일이 있는 곳에 C# 프로젝트의 실행 파일을 갖다 놓기 위해서입니다

같은 폴더에서 실행하는 것이 편합니다

DLL 가져와서 클래스로 만들기

C# 프로젝트 안에 클래스를 하나

추가시켜 줍니다

그리고Using System.Runtine.InteropService;

를 추가해 주신 다음

DllImport로 dll에 들어있는 함수를

가져옵니다

CallingConvention을 바꾸지 않으면

PInvokeStackImbalance가 발생합니다

DLL 가져와서 클래스로 만들기

• 주의할 점• Namespace를 잘 봐두세요

• 나중에 가져다 쓸 때 클래스를 못 찾을 수가 있습니다

• C#클래스의 함수는 DLL 에 들어있는 함수, 즉 C++ 파일에서 만든 함수와 이름이 똑같아야 합니다

• 리턴 타입도 같아야 합니다.

• 함수를 가져올 때 public static extern 을 꼭 앞에 붙여야 합니다• 예를 들어 void LoadMesh(); 함수를 쓰고 싶다면

• public static extern void LoadMesh();

• 라고 선언해줘야 합니다

C# Form 만들기

뭔가 허전합니다

PictureBox 하나 들어있는 form인데요

이번 예제에서는 단추도 별 필요 없습니다

물론 제대로 된 툴로 만들기 위해서는

보다 많은 이벤트를 처리할 수 있어야 합니다

C# Form 만들기

PictureBox의 이름을 View로 바꿔줍니다

안 바꿔도 실행에는 문제가 없지만 앞으로 추가될

Item들을 생각하면 미리 이름을 정리해 두는 것이

좋을 것 같네요

구현

이게 끝입니다

C#에서 생성한 클래스가 DirectX 이므로

DirectX.함수명() 형태가 됩니다

몇 군데만 살펴보면,

D3D 초기화를 위해 핸들을 넘겨주는데

This.View.handle.ToInt32()

형태로 넘겨줍니다.

구현

DirectX.cs

Main

핸들이 인트값이라는 점을 이용해

C++ 자료형이 아니라도 넘겨줄 수

있는 것입니다

아까 불러올 때 Int32를 인자로 받게

선언했습니다

구현

렌더링 할 때 함수를 async로 선언하고

아래쪽에 await Task.Delay(10);을 줬는데

이 둘은 한 쌍으로 비동기 프로그래밍을 위해

사용합니다

생각해보면 화면에 그려주는 작업은 일정한

주기로 계속 반복되어야 하니 비동기로 따로

빼주는 것이 맞습니다

결과

잘 뜹니다!