使用Visual Studio定位各个平台

时间:2012-02-29 03:02:59

标签: c# .net visual-studio-2010 mono csproj

我正在编写一个适用于.NET和Mono的应用程序。然而,它的组件只能用于其中一个或另一个。例如,应用程序的模块化部分使用WPF,这在Mono中不可用(它甚至不会构建!!!)。该应用程序的另一部分在libpango上使用PInvoke,它通常仅在Unix上可用。

是否可以针对具有不同构建参数的Visual Studio定位单个平台?

目前模块化部件不在他们自己的项目文件中,但我可以轻松地将它们移动到。

2 个答案:

答案 0 :(得分:2)

#define/#if块是执行此操作的一种方法。还有一个conditional attribute。您可能还想查看MSBuild targets

您可能还想考虑您的类设计以及是否可以共享具有更多提供程序或“插件”模型的共享接口以支持不同的平台。 Microsoft开发了一个Portable Libraries项目类型,可能对此有所帮助。

答案 1 :(得分:1)

条件编译可能使您的代码难以理解和维护。我个人反对。

我的建议是你利用好的设计模式来隔离特定于平台的位,

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

JavaDepend是一个Windows窗体项目,因此它的移植体验可能对您有所帮助。

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

通过这种方式,您始终可以将整个解决方案一起编译,将它们打包在一起。在运行时,适配器可以在平台检测后加载正确的平台组件/组件。

对于你的情况,你可以使用WPF for Windows,然后你必须将WPF位与业务逻辑代码隔离,然后再为其他平台编写UI(GTK#for Linux,MonoMac for OS X)。这种方法可以看作是

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

通过这种方式,您需要针对每个平台进行不同的打包,但核心程序集/程序集可以是相同的。