2015-02-06 9 views
2

"C++ 게임 개발"이라는 학생 프로젝트를 만들고 있습니다. 그것은 클라이언트와 서버가있는 카드 게임입니다. 클라이언트 응용 프로그램에는 Visual Studio 2013의 Windows Forms로 이미 만든 몇 개의 창이 있습니다. 클라이언트/서버 통신의 경우 Internet Communications Engine (ICE)을 사용하기로 결정했습니다. 클라이언트 프로젝트에서 빌드하는 동안 ICE에 의해 자동 생성 된 코드에 오류가있었습니다. ICE가 C++/CLI를 지원하지 않으며, 네이티브 C++ 또는 C# 만 사용할 수 있음을 발견했습니다.Windows GUI 및 기본 C++

이제 C++ (예를 들어 익숙하지 않은 MFC 사용) 또는 네이티브 C++ 및 C++/CLI를 사용하여 전체 클라이언트 응용 프로그램을 네이티브 C++로 만들지 여부를 결정합니다. CLR 클래스 라이브러리에 Windows Forms를 사용하고 네이티브 C++ 프로젝트에서 엔트리 포인트를 사용하여 링크했습니다. 또한 사소한 것도 아닙니다.

시간이 많이 소요되는 옵션을 선택하려고합니다. 나는 이러한 접근법의 복잡성을 예측하는 데 도움을 청하고있다. 나는 두 번째를 더 좋아하지만 가장 쉬운 방법인지 확신 할 수 없다.

+4

['Qt' 라이브러리] (http://en.wikipedia.org/wiki/Qt_%28software%29)에 익숙합니까? 이것은 잘 지원되고 있으며, MFC 대신 매우 일반적으로 사용되는 대안입니다. – CoryKramer

+0

아니요, 실제로 제 첫 번째 Windows GUI 응용 프로그램입니다. 그 전에는 콘솔 앱에서 C++을 배웠습니다. – Syb3rian

+0

당신은 C++/CLI 프로젝트를 C# ICE와 연결하는 것이 가장 쉬운 방법 일 것입니다. 쉬워요. C# 인터페이스는 기본적으로 C++/CLI 인터페이스입니다. 차이점은 대부분 구문 론적이어야합니다. https://www.zeroc.com/icedotnet.html에 따르면 "Ice 런타임은 Visual Basic과 같은 다른 .NET 언어에서도 사용할 수 있습니다."(C++/CLI는 다음과 같습니다. –

답변

1

C++/CLI는 기본 C++ 코드를 사용할 수 있습니다.

생성 된 코드를 /clr없이 빌드하는 "정적 라이브러리 프로젝트"에 스틱하십시오. 그런 다음 정적 라이브러리를 C++/CLI DLL의 종속성으로 나열하십시오.

나머지는 링커가 알아낼 것입니다. 그 결과를 "혼합 모드 어셈블리"라고합니다.

comm 라이브러리는 관리되는 유형을 허용하지 않을 수도 있습니다. 괜찮습니다. C++/CLI는 관리되지 않는 데이터 모델과 관리되는 뷰 (UI) 클래스를 완벽하게 혼합 할 수 있습니다.

+0

감사합니다. 저는 Visual Studio에서 네이티브 C++ 정적 또는 동적 라이브러리를 만들고 ICE에서 생성 한 코드를 넣은 다음 "CLR Console Application"프로젝트에서이를 참조한 샘플 솔루션을 몇 가지 시도했습니다. 두 경우 모두 정상적으로 작동했습니다. 내가 생각했던 것보다 훨씬 쉬워졌다. [This] (https://msdn.microsoft.com/en-us/library/ms235627%28v=90.aspx) MSDN 기사가 도움이되었습니다. "혼합 모드 어셈블리"에 동적이 아닌 정확히 정적 라이브러리를 사용하는 것이 중요합니까 아니면 중요하지 않습니까? 왜 C++ 클래스의 C++/CLI 래퍼가 필요합니까? 처음 엔 그게 필요하다고 생각했습니다. – Syb3rian

+0

동적 라이브러리를 사용할 수 있지만 런타임에 사용할 수 있어야하는 추가 DLL 파일이 있습니다. 정적 라이브러리를 사용하면 실제로 사용되는 코드가 메인 관리 어셈블리로 가져와 (혼합 모드로 만들기 때문에) 런타임에 하나의 파일 만 필요합니다. 또한 네이티브 코드에 DLL을 사용하는 경우 .NET 어셈블리 규칙이 아닌 기본 DLL로드 규칙이 적용됩니다. 다른 검색 경로, 파일을 찾을 수 없을 때 다른 오류. 결합 된 "혼합 모드"DLL을 사용하는 것이 더 쉽습니다. –

+0

C++/CLI 래퍼는 C# (또는 F # 또는 VB.NET 또는 기타 .NET 언어)과 네이티브 C++ 코드 사이에 풀로 사용됩니다. C++/CLI는 네이티브 코드를 직접 사용할 수 있습니다 (이것은 래퍼를 작성할 수있게 해주는 아주 좋은 것입니다).이 C++ interop 기능은 실제로 공식적으로 "It Just Works"라고 불립니다. –

3

이것은 GUI에 얼마나 많은 복잡성이 있는지에 따라 다릅니다. 100 개의 대화 상자/컨트롤이있는 경우 네이티브 C++로 다시 작성하면 잘못된 대답 일 수 있습니다. 이 경우 GUI를 라이브러리로 만드는 것이 더 합리적입니다.

그러나 GUI를 프로세스로 유지하고 서버에 ICE 호출을 전달하는 네이티브 C++로 프록시 라이브러리를 빌드하는 것이 더 좋은 옵션 일 것입니다. (그래서 C++/CLI exe는 새로운 C++ 라이브러리에서 서버로 ICE 호출을하거나 그 반대로 ICE 호출을하는 함수를 호출합니다.

GUI가 작 으면 최신 (더 잘 지원되는 C++/CLI) 시스템으로 다시 작성하는 것이 가장 좋습니다. 현재 Qt는 네이티브 GUI의 궁극적 인 부분 일 것입니다 (그러나 MFC 나 wxWidgets와 같은 대안이 있습니다). 이러한 경우에도 네트워킹 하위 시스템을 네이티브 라이브러리로 코딩하는 것이 좋습니다. 그런 다음 GUI를 변경하고 원하는대로 GUI 스택의로드를 시험해 볼 수 있습니다. 단 하나의 프리젠 테이션 레이어 변경만으로 Android 또는 iOS로 게임을 이식 할 수 있습니다.

세 번째 대안은 다른 통신 시스템을 선택하는 것입니다. ICE와 같은 RPC는 좋지만, 오늘날 REST 서비스 (Mongoose 또는 NxWeb과 같은 임베디드 C++ 웹 서버 사용)를 통해 웹 기반 통신 인 'where at its'은 클라이언트에 데이터를 다시 보내야 할 경우 WebSocket을 지원하므로 필요한 모든 기능을 제공합니다. 그런 다음 GUI를 HTML 기반으로 다시 작성할 수 있습니다!

그래서 : 통신을 네이티브 C++ 라이브러리에 넣으십시오.

+0

다양한 옵션을 선택해 주셔서 감사합니다. 관리되는 GUI가 복잡하지 않으므로 Qt로 원래의 GUI로 리메이크 할 수 있기를 기대합니다. Qt는 ICE와 호환되며 Visual Studio 용 추가 기능을 제공합니다. – Syb3rian

+0

또한 네이티브 C++ 라이브러리에 통신을 연결하는 것이 매우 합리적이라고 생각합니다. 정말 쉽게 응용 프로그램을 포팅합니다. 다른 OS로. 처음에는 다른 반대 아키텍처를 생각하고있었습니다. 아이디어를 가져 주셔서 감사합니다! – Syb3rian

+0

Qt GUI에는 * native *가 없습니다. Windows 전용 응용 프로그램을 고려하는 마지막 옵션입니다. 다른 모든 것들은 (심지어 라이브러리를 전혀 사용하지 않아도) Qt가 허용하는 것보다 더 높은 품질의 GUI를 가져올 것입니다. – IInspectable