ݺߣ

ݺߣShare a Scribd company logo
C# 맛보기 2
C++에서 만든 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);을 줬는데
이 둘은 한 쌍으로 비동기 프로그래밍을 위해
사용합니다
생각해보면 화면에 그려주는 작업은 일정한
주기로 계속 반복되어야 하니 비동기로 따로
빼주는 것이 맞습니다
결과
잘 뜹니다!

More Related Content

C# 뉴비를 위한 맛보기 2

  • 1. C# 맛보기 2 C++에서 만든 DLL을 어떻게 C#에서 쓸 것인가
  • 2. 들어가기 전에 • 미리 알아야 할 것 • C++ DirectX 프로젝트 만들기 • C++ DLL 만들기 • 별로 안 어렵습니다!
  • 3. C++ DLL 프로젝트 만들기 설정을 이렇게 맞춰줍니다 DLL 파일을 만들 것이고 추가 옵션에서 내보내기 기호를 골라줍니다
  • 4. C++ DLL 프로젝트 만들기 DX SDK가 미리 설치되어야 합니다 경로를 추가해줍니다
  • 5. C++ DLL 프로젝트 만들기 링커  추가 종속성 d3d9.lib d3dx9d.lib dxerr.lib dxguid.lib winmm.lib 얘네들을 추가해줍니다
  • 6. DirectX Tutorial 중에서 아무 거나… • 소스를 Copy & paste 해 줍니다 • 물론 직접 짜셔도 됩니다
  • 7. 헤더 파일을 바꿔야 합니다 기본 설정은 #ifdef로 되어있는데 일단 싹 지우신 다음 extern “C” 를 사용합니다 선언한 함수들은 아까 cpp파일에서 구현한 함수입니다 당연히 리턴 타입과 인자도 일치해야 합니다 그리고 DLL을 통해 공유하고 싶은 함수들만 선언해야 합니다 여기선 테스트를 위해 모든 함수를 집어넣었습니다
  • 8. 컴파일을 한 번 해 볼까요? 잘 됩니다 여기서 막히면 다음 과정이 불가능합니다 
  • 9. C# 프로젝트 만들기 C++ 프로젝트가 있는 솔루션에다가 C# 프로젝트를 추가시켜줍니다!
  • 10. C# 프로젝트 만들기 1 2 3 생성된 C# 프로젝트를 우클릭  속성  빌드  출력 항목으로 가 봅니다.
  • 11. C# 프로젝트 만들기 이렇게 고쳐줍니다 C++에서 나온 DLL 파일이 있는 곳에 C# 프로젝트의 실행 파일을 갖다 놓기 위해서입니다 같은 폴더에서 실행하는 것이 편합니다
  • 12. DLL 가져와서 클래스로 만들기 C# 프로젝트 안에 클래스를 하나 추가시켜 줍니다 그리고 Using System.Runtine.InteropService; 를 추가해 주신 다음 DllImport로 dll에 들어있는 함수를 가져옵니다 CallingConvention을 바꾸지 않으면 PInvokeStackImbalance가 발생합니다
  • 13. DLL 가져와서 클래스로 만들기 • 주의할 점 • Namespace를 잘 봐두세요 • 나중에 가져다 쓸 때 클래스를 못 찾을 수가 있습니다 • C#클래스의 함수는 DLL 에 들어있는 함수, 즉 C++ 파일에서 만든 함수 와 이름이 똑같아야 합니다 • 리턴 타입도 같아야 합니다. • 함수를 가져올 때 public static extern 을 꼭 앞에 붙여야 합니다 • 예를 들어 void LoadMesh(); 함수를 쓰고 싶다면 • public static extern void LoadMesh(); • 라고 선언해줘야 합니다
  • 14. C# Form 만들기 뭔가 허전합니다 PictureBox 하나 들어있는 form인데요 이번 예제에서는 단추도 별 필요 없습니다 물론 제대로 된 툴로 만들기 위해서는 보다 많은 이벤트를 처리할 수 있어야 합니다
  • 15. C# Form 만들기 PictureBox의 이름을 View로 바꿔줍니다 안 바꿔도 실행에는 문제가 없지만 앞으로 추가될 Item들을 생각하면 미리 이름을 정리해 두는 것이 좋을 것 같네요
  • 16. 구현 이게 끝입니다 C#에서 생성한 클래스가 DirectX 이므로 DirectX.함수명() 형태가 됩니다 몇 군데만 살펴보면, D3D 초기화를 위해 핸들을 넘겨주는데 This.View.handle.ToInt32() 형태로 넘겨줍니다.
  • 17. 구현 DirectX.cs Main 핸들이 인트값이라는 점을 이용해 C++ 자료형이 아니라도 넘겨줄 수 있는 것입니다 아까 불러올 때 Int32를 인자로 받게 선언했습니다
  • 18. 구현 렌더링 할 때 함수를 async로 선언하고 아래쪽에 await Task.Delay(10);을 줬는데 이 둘은 한 쌍으로 비동기 프로그래밍을 위해 사용합니다 생각해보면 화면에 그려주는 작업은 일정한 주기로 계속 반복되어야 하니 비동기로 따로 빼주는 것이 맞습니다