2012-02-29 117 views
0

我正在写一个应用程序,将为.NET和单声道。但是它的组件只能用于其中一个。例如,应用程序的模块化部分使用WPF,Mono中不提供(它甚至不会构建!!!)。该应用程序的另一部分在libpango上使用PInvoke,通常只能在Unix上使用。针对与Visual Studio个别平台

是否有可能针对每个平台与Visual Studio与不同的构建参数为每个?

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

+0

使用#ifdef/#endif块来检查单声道环境,并在其中放入适当的代码,或者将.NET和Mono的东西封装到通用调用中,并在那里使用#ifdefs,我忘记了MONO环境的定义是什么可能是单声道:P) – 2012-02-29 03:05:50

+0

可能重复的[我如何有条件地编译我的C#单声道与微软.NET?](http://stackoverflow.com/questions/329043/how-can-i-conditionally-compile-my -c-sharp-for-mono-vs-microsoft-net) – skolima 2012-02-29 06:48:55

+0

我不认为它是完全重复的,因为这个问题更多地考虑了事物的依赖管理(引用)方面。 – 2012-02-29 13:06:20

回答

2

#define/#if块是这样做的一种方法。还有一个conditional attribute。你可能也想看看MSBuild targets

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

+0

我已经在使用#define /#if blocks。但是,项目引用不起作用。例如,即使所有这样的代码被注释掉,具有“PresentationCore”的项目仍然会在Mono下失败。 – voidvector 2012-02-29 03:55:54

+0

在命令行上构建时,可以指定引用列表。我认为这是有多个msbuild文件进来的地方。它变得复杂,但是你将有一个运行VS(你的主要csproj文件),然后是另一个单声道的msbuild文件。两者都可以建立在命令行上 - 或者在一个文件中包含多个目标。 – 2012-02-29 03:59:25

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) 

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

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

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

通过这种方式,您需要打包分别为每个平台,但核心组件/组件可以是相同的。