2009-12-17 3 views
6

내 전체 응용 프로그램 (20MB 실행 파일이있는 다소 큰)은 관리되지 않는 C++로 작성되었습니다. 관리되는 코드를 사용할 때의 장점을 분명히 알 수 있으므로 응용 프로그램에서 관리되는 코드를 소개하고자합니다.하지만 어디서부터 시작해야합니까?내 응용 프로그램이 관리되지 않습니다. 어디서 관리되는 코드를 소개합니까?

C++/CLI를 쉽게 사용하고 나머지 응용 프로그램과 연결할 수 있습니까? (C++/CLI 구문은 오히려 '이국적인'것처럼 보일지라도).

또는 C#으로 옮기는 것이 더 좋지만, 관리되지 않는 C++ 코드와 함께이 링크를 연결하는 가장 좋은 방법은 무엇입니까?

모든 C++ 코드를/clr 옵션과 함께 컴파일하는 것이 합리적입니까? 이게 효과가 있니?

마샬링에 대해 걱정해야합니까? 이것은 오버 헤드를 줄 수 있습니까 (20 년 전에 fortran과 C를 혼합했을 때와 마찬가지로) 성능 저하없이 관리 형과 비 관리 형간에 전환 할 수 있습니까? 성능은 때로는 수 기가 바이트의 메모리를 처리하는 과학적 응용 프로그램이므로 내 응용 프로그램에서 정말로 중요합니다.

사용자 인터페이스를 다시 디자인하고 C#으로 작성하고 관리되지 않는 C++에서 나머지 응용 프로그램 (계산 논리, 비즈니스 논리, 데이터베이스 인터페이스 ...)을 유지하는 것이 맞습니까?

가끔 내 기가비트의 메모리를 처리해야하기 때문에 64 비트 변형이 있습니다. 64 비트 관리 코드를 쉽게 가질 수 있습니까? 그 많은 메모리가 사용된다면 가비지 컬렉터는 여전히 효율적일까요?

간단히 말해서 : 어디서부터 시작해야합니까? 패트릭

+2

관리되는 C++은 물고기도 새도 아니며 가능한 경우 피할 수 있습니다. –

답변

1

잠시이 질문을 생각하십시오.

나는 대답이 C++과 C#을 섞어 놓지 않고 처음부터 올바른 아키텍처를 얻는다는 것을 깨달았다.

아키텍처가 정확하고 분리해야하는 부분이 분리되어 있으면 다른 모듈 (외부, 다른 언어 등)을 사용하여 응용 프로그램의 일부를 변경하는 것이 더 쉬워야합니다.

마샬링 중 성능 문제와 관련하여 .Net이 더 성숙 될 때까지 기다려야 할 것입니다.

1

는 논리의 C#을 선을 스냅 할 수있는 통합 지점에서 결정하고 그 반대의 경우도 마찬가지 C++ 및 침입, 응용 프로그램을 프로필. Facade 디자인 패턴을 C++을 C#으로 점차적으로 대체하는 시스템으로 옮겨 갈 계획으로 이들을 배치하십시오. 주요 관심사는 각 후보 Facade/인터페이스에서 언어를 전환하기로 결정할 때 CPU 및 메모리 비용입니다.

원본 C++ 코드에 대한 소스 코드 세트와 소스 코드 저장소, 외관에 대한 또 다른 세트 및 저장소 및 C#을 사용하면 편집 작업을 통합 할 수 있기를 원할 것입니다.

향상된 기능/유지 관리 작업이 용지함에 포함되어 있으므로 코드베이스에이 기능을 적용하고 외관이나 기능이 변경 될 가능성이 가장 적은 코드부터 시작하여 시스템을 통과하도록하십시오 변경 사항이 두 배로 증가합니다.

또한 이상적인 구조로 작업하여 정면을 롤백 할 수 있으므로 걸린 부분에 모자를 쓰면 100 % C++로 돌아갈 수 있습니다.

특히 이해하기 어려운 C++ 모듈이 C++ 조각과 C# 조각으로 분리 될 수 있는지 테스트하려면 파이프 또는 소켓을 사용하여 통신하는 두 개의 서로 다른 Win32 C++ 프로세스에서 실행하십시오. 그렇게하면 메모리 관리 나 성능에 문제가 있는지 여부를 더 잘 이해할 수 있기 때문에 해당 시점에서 콜 체인을 분리 할 수 ​​있습니다.

1

우리는 수천 명의 사용자가 사용하는 업무용 응용 프로그램에서 설명한 것과 정확히 동일합니다. 기본적으로 기존 응용 프로그램을 그대로 유지하므로 실행 파일은 여전히 ​​C++/CLI가 아닌 100 % 관리되지 않는 실행 파일입니다. 그런 다음 비즈니스 객체, 사용자 컨트롤 및 GUI 코드 등으로 구성된 .NET dll에 새로운 C# 코드를 모두 넣습니다.

기본적으로 모든 새 코드는 C#으로 작성됩니다. 우리는 그냥 접착제입니다 C + +/CLI는 1 DLL이 있습니다. 이를 통해 기존 C++ 코드를 변경하지 않고도 관리 코드와 비 관리 코드를 쉽게 상호 운용 할 수 있습니다. 이것은 우리가 작성해야하는 C++/CLI 코드의 양을 제한합니다. 네이티브 코드는 관리 코드와 통신 할 수있는 혼합 모드 코드와 통신합니다. 혼합 모드 dll은 C# 클래스에서 이벤트를 후킹 할 수 있으므로 C# 코드는 이벤트를 발생시켜 C++/CLI (원시 코드와 통신 할 수 있음)와 통신 할 수 있습니다.

우리는 또한 기존 C++ 응용 프로그램에서 .NET UserControls를 호스팅 할 수 있습니다 (WinForms는 WINAPI를 둘러싼 래퍼이므로 어쨌든 잘 작동합니다).

매우 잘 작동하며 C#에서 전체 GUI를 다시 작성하지 않고도 기존 코드를 유지할 수 있습니다.

관련 문제