我正在编写一个适用于.NET和Mono的应用程序。然而,它的组件只能用于其中一个或另一个。例如,应用程序的模块化部分使用WPF,这在Mono中不可用(它甚至不会构建!!!)。该应用程序的另一部分在libpango上使用PInvoke,它通常仅在Unix上可用。
是否可以针对具有不同构建参数的Visual Studio定位单个平台?
目前模块化部件不在他们自己的项目文件中,但我可以轻松地将它们移动到。
答案 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 ------|
通过这种方式,您需要针对每个平台进行不同的打包,但核心程序集/程序集可以是相同的。