블로그 이미지
ChocoTart

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
  • total
  • today
  • yesterday
2013. 11. 26. 11:46 MapTool


* 목적 
DirectX 를 이용한 C++ StaticLibrary 를 이용하여 C#으로 툴을 만들기 위해서
C++ Library를 DLL로 만들어 이를 C# WinForm 환경에서 연동하여 사용해보자

1 준비


( ABaseCoreDX10, KMapDX10  <-- StaticLibray 프로젝트 이고 , CLRLIB <-- DLL 생성 프로젝트 , Sample 은 StaticLibray Test 프로젝트 , MapTool <-- C# winform 프로젝트)

1) C++ Library 준비
정적 라이브러리가 준비 되어야 한다 
2) Test를 위한 Sample 프로젝트도 만들자 (C++ Win32)

3) Dll을 만들기 위한 프로젝트를 만들자

 (C++ 탭에서 ClassLibrary 선택하여 프로젝트 생성)

4) C#의 WinForm 환경으로 실질적으로 Tool 이 될 프로젝트생성


2. DLL 생성

1) 간단히 라이브러리가 잘 돌아가는지 Sample 에서 테스트를 해보자

이상 없이 렌더링 되고 있다.


2 ) DLL을 만들어보자

-사전작업

<1> 헤더파일 연결

추가 포함 디렉토리에 연동할 라이브러리 헤더파일 폴더를 지정해준다.

<2> Lib 폴더 연결

추가 라이브러리 디렉토리에 

lib 파일이 있는 폴더 연결

<3> lib 파일 연결

연동하여 사용할 lib 파일들을 추가 종속성에 넣어준다.

<4> Library 폴더의 변경이 그대로 반영되어 DLL 프로젝트가 빌드 되도록 프로젝트 종속성을 해주자

해당 프로젝트의 우클릭시 프로젝트 종속성이라고 나올 것이다.

(Library 프로젝트의 변경도 없는대 매번 Library  프로젝트 까지 재 빌드 되어 컴파일 시간이 길어 진다면 잠깐 프로젝트 종속성을 끊어도 무방하다 )

(필자의 경우 KMapDX10 만 종속성 체크를 했는대 KMapDX10 은 ABaseCoreDx10에 종속 되어잇어 

결과적으로 DLL 프로젝트를 빌드시 전부다 빌드가 된다.)




3) 코딩 

<1> WrapClass 만들기

C# 환경에서는 C++내용을 쓰지 못하기에 해당 내용 

즉 라이브러리의 내용을 Wraping 하여 DLL로 만들고 이를 C# 윈폼 환경으로 쓰기위해

WrapClass를 만든다 

(위 내용은 필자가 여기저기 참고하다가 지 멋대로 해석하여 알게된 내용으로 잘못된 내용일 가능성이 다분함)


<2> 함수내용 구현 (기본적인 초기화 함수)


필자의 라이브러리 는 윈도우를 초기화하고 해당윈도우로 디바이스를 생성 후 이것저것 초기화후 

Run 하여 돌린다 

이때 우리는 필요 없어진 것이 윈도우 이다 이 윈도우를 대체할게 C# winform 인것이다 

때문에 c# winform 에서 윈도우 핸들과 인스턴스를 가져와서 이를 사용하여 디바이스 생성등을 하여

프로젝트가 실행되면 Winform 윈도우에 렌더링 이 된다.

따라서 Initialize() 함수는 핸들과 인스턴스를 받아서 ( INT_PTR로 받는것은 C# 윈폼환경에 HWND, HINSTANCE가 없기에  그렇다  ) 그 값들을 캐스팅하여 넣어주고

Run 함수로 초기화 및 메인루프를 돌려준다.



4. C# Winform 작업

1) 사전작업

해당 프로젝트 역시 프로젝트 종속성을 해준다 물론 DLL 프로젝트와 연결 시켜준다.

하위에 있는 참조 폴더에 우클릭후 참조추가 버튼을 눌러 프로젝트 탭에서 DLL 프로젝트를 추가해준다.

(추가시 참조에 CLRLIB(DLL프로젝트) 이 추가 된것을 확인 할수 있다. )



해당 프로젝트에서 아래의 

안전하지 않은 코드 허용 

비관리코드 디버깅사용을 체크하여야

Tool 디버깅시 C++내용 즉 라이브러리 소스까지 들어가 확인 할수있다.


2) 코딩

-Program.cs 에서 원래 내용을 수정하자

Initialzie() 함수는 사용자 정의 한 함수이다 . ( C#내에서)


- Form1.cs에서 함수 내용을 넣어주자.

해당 윈폼의 핸들을 넘겨준다.



이제 전체 빌드하면 Winform 환경에 렌더링이 된다


필자의 경우 fx파일 ( Shader파일을 로드할때 경로에 대한 에러가 계속 발생했는대 정확한 원인을 몰라 절대 경로를 넣었다.

절대 경로의 경우 ('\') 를 ('/') 로 바꿔줘야한다.

( 추가 작업중 경로에 대한 문제는 EXE파일의 경로를 기준으로 상위폴더로 바꾸니 잘되었다 )






posted by ChocoTart