2012-02-29 5 views
0

.NET과 Mono에서 모두 작동하는 앱을 작성 중입니다. 그러나 그것의 구성 요소는 하나 또는 다른 것에 대해서만 이용 가능할 것이다. 예를 들어, 응용 프로그램의 모듈 부분은 Mono에서 사용할 수없는 WPF를 사용합니다 (빌드하지 않을 수도 있습니다 !!!). 응용 프로그램의 또 다른 부분은 일반적으로 유닉스에서만 사용할 수있는 libpango에서 PInvoke를 사용합니다.Visual Studio로 개별 플랫폼 타겟팅하기

각기 다른 빌드 매개 변수를 사용하여 Visual Studio로 개별 플랫폼을 대상으로 지정할 수 있습니까?

현재 모듈 부품은 자체 프로젝트 파일에 없지만 쉽게 이동할 수 있습니다.

+0

#ifdef/#endif 블록을 사용하여 모노 환경을 확인하고 적절한 코드를 입력하거나. NET 및 모노 항목을 일반 호출로 랩핑하고 #ifdef를 사용하면 MONO 환경에 대한 정의가 무엇인지 잊어 버릴 수 있습니다 아마도 MONO : P) –

+0

가능한 복제본 [Mono 대 Microsoft .NET에 대해 조건부로 C#을 컴파일 할 수 있습니까?] (http://stackoverflow.com/questions/329043/how-can-i-conditionally-compile-my -c-sharp-for-mono-vs-microsoft-net) – skolima

+0

이 질문은 종속성 관리 (참조) 측면을 더 많이보고 있기 때문에 정확한 복제본이라고 생각하지 않습니다. –

답변

2

#define/#if 블록이이를 수행하는 한 가지 방법입니다. conditional attribute도 있습니다. MSBuild targets을 살펴볼 수도 있습니다.

클래스 디자인과 다른 플랫폼을 지원하기 위해 더 많은 공급자 또는 "플러그인"모델을 사용할 수있는 공유 인터페이스를 공유 할 수 있는지 생각해보십시오. Microsoft는 이것을 도울 수있는 Portable Libraries 프로젝트 유형을 개발했습니다.

+0

블록 # define/#을 이미 사용하고 있습니다. 그러나 프로젝트 참조가 작동하지 않습니다. 예를 들어 "PresentationCore"가있는 프로젝트는 이러한 코드가 주석 처리 된 경우에도 Mono에서 계속 실패합니다. – voidvector

+0

명령 줄에서 빌드 할 때 참조 목록을 지정할 수 있습니다. 나는 그것이 여러 msbuild 파일을 가지고있을 것이라고 생각합니다. 복잡 해지지만 VS (메인 csproj 파일)와 다른 하나는 모노로 실행되는 하나의 msbuild 파일을 가질 것입니다. 둘 모두 명령 행에서 빌드하거나 하나의 파일에 여러 대상을 포함시킬 수 있습니다. –

1

조건부 컴파일은 코드를 이해하고 유지 관리하기 어렵게 만듭니다. 개인적으로, 나는 그것에 반대한다.

나의 제안은 포팅 경험이 당신을 도울 수 있도록

http://codebetter.com/patricksmacchia/2011/11/07/real-world-feedback-on-a-net-to-mono-migration/

JavaDepend는 윈도우 Forms 프로젝트를, 당신은 플랫폼 특정 비트를 분리하는 좋은 디자인 패턴을 활용하는 것입니다.

WinForms executable (.exe) -> Platform adapter (.dll) -> Windows (.Windows.dll) 
                | 
                --> Other platforms (.Unix.dll) 

이렇게하면 항상 전체 솔루션을 함께 컴파일하고 함께 패키지화 할 수 있습니다. 런타임시 어댑터는 플랫폼 감지 후 올바른 플랫폼 어셈블리/어셈블리를로드 할 수 있습니다.

아마도 WPF for Windows를 사용할 수 있습니다. 비즈니스 로직 코드에서 WPF 비트를 분리 한 다음 다른 플랫폼 (Linux 용 GTK #, OS X 용 MonoMac)에 UI를 다시 써야합니다. 이러한 접근 방식은 이런 식으로

WinForms/WPF executable (.exe) -> Platform independent biz-logic code (.dll) 
           ^^ 
MonoMac executable    ---| | 
            | 
GTK\# executable    ------| 

으로 시각화 할 수 있으며, 각 플랫폼에 대해 다르게 포장해야하지만 핵심 어셈블리/어셈블리는 동일 할 수 있습니다.

관련 문제