2012-02-29 6 views
0

私は.NETとMonoの両方で動作するアプリを書いています。しかし、そのコンポーネントはどちらか一方のためだけに利用可能です。たとえば、アプリケーションのモジュラ部分はWPFを使用しますが、これはMonoでは利用できません(ビルドしなくても!!!)。このアプリケーションのもう一つの部分はlibpangoでPInvokeを使用しています。通常libpangoはUnix上でしか利用できません。Visual Studioで個々のプラットフォームをターゲットにする

それぞれのビルドパラメータをVisual Studioで個別に設定することはできますか?

現在、モジュールパーツは独自のプロジェクトファイルには含まれていませんが、簡単に移動できます。

+0

#ifdef/#endifブロックを使用してモノ環境をチェックし、そこに適切なコードを入れたり、.NETとMonoのものを汎用呼び出しにラップして#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ブロックはこれを行う1つの方法です。 conditional attributeもあります。また、MSBuild targetsを調べることもできます。

あなたのクラスデザインと、共有することができるかどうかを考えると、より多くのプロバイダや「プラグイン」モデルが異なるプラットフォームをサポートできるようにすることができます。 MicrosoftはPortable Librariesプロジェクトタイプを開発しました。

+0

私は既に#define /#ifブロックを使用しています。しかし、プロジェクト参照は機能しません。たとえば、「PresentationCore」を含むプロジェクトは、そのようなコードがすべてコメント化されていても、Monoで失敗することがあります。 – voidvector

+0

コマンドラインでビルドするときに、参照のリストを指定することができます。私はそれが複数のmsbuildファイルを持って来るところだと思います。複雑になりますが、VS(メインのcsprojファイル)と別のものを実行するmsbuildファイルが1つあります。どちらもコマンドライン上に構築することも、複数のターゲットを1つのファイルに含めることもできます。 –

1

条件付きコンパイルでは、コードを理解して維持するのが難しくなる可能性があります。個人的に、私はそれに反対しています。

私の提案はJavaDepend

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

、あなたはプラットフォーム固有のビットを分離する良いデザインパターンを利用することはあるの移植の経験はあなたを助けるかもしれないので、Windowsフォームプロジェクトです。

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    ------| 

として視覚化することができ、各プラットフォーム用に別々にパッケージ化する必要がありますが、コアアセンブリ/アセンブリは、同一とすることができます。

関連する問題