我目前正在开发一个项目,其源代码应尽可能可移植;也就是说,该项目(用 C# 编写,但不是很相关)代表一个应在 Android(使用 Mono-Android)、iPhone(使用 MonoTouch)和 WinMobile(使用官方 Compact Framework)上执行的应用程序。无需赘述,相应的 MSBuild 解决方案由一个独立平台的库(至少从源代码的角度来看)组成,它声明了各种接口(interface)和类,这些接口(interface)和类代表了各个平台不常见的每个功能的抽象(即用户界面)。此外,还有一个相应的库专门(针对每个平台)“基础库”;有效的应用程序可执行文件是使用抽象和通用标准库的程序。
在 WinMobile 和 Android 上进行开发并不是什么问题:Mono-Android 插件可以安装在 VS 2010 上,因此这两个平台都可以用 MS VS 处理。
最初解决方案是在 VS 中创建的,因此会自动生成初始配置和相关项目(Android 和 WinMobile)。
之后,我将解决方案导入到 Mac 下的 MonoDevelop(MonoTouch 官方支持的唯一平台)中,并为 iPhone 库创建了项目;切换配置以生成程序集(iPhoneSimulator),由于缺少项目类型配置,无法编译“基础库”;具体来说,MonoTouch 使用的 GUID 为 <ProjectTypeGuids>
是 {E613F3A2-FE9C-494F-B74E-F63BCB86FEA6}
;添加此 GUID 我现在可以在 MonoDevelop 中编译“基础库”。
当我尝试在 VS 中重新导入解决方案时,出现了问题:由于没有 Windows 版本的 MonoTouch,VS 无法找到指定项目类型的加载项,并且项目无法加载。
查看MSBuild项目文件的规范,似乎有很多选项无法在VS的项目/解决方案编辑器中设置或修改;但是格式相当复杂,现在我请求您的帮助!
有没有办法在项目文件中指定仅当独立于我正在使用的环境选择特定配置时才存在项目类型?
最佳答案
一般方法是这样的;逐步构建您的属性(property)的条件,引用该属性(property)可能已经具有的任何值:
<ProjectTypeGuids
Condition="'$(BuildingInsideVisualStudio)' != 'true'"
>;{E613F3A2-FE9C-494F-B74E-F63BCB86FEA6}"</ProjectTypeGuids>
<ProjectTypeGuids>{OTHER-GUIDS-HERE}$(ProjectTypeGuids)</ProjectTypeGuids>
这将检测 VS 条件(构建时)并忽略未知的 guid。但我不确定项目开放时它是否会起作用,该属性可能仅适用于建筑。在 Mono 上构建可能有类似的“sentinal”属性,您可以反转条件。
关于iphone - 多平台 MSBuild 项目文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5964890/