10

我们正在启动一个跨平台项目,以部署到 Android 和 iOS。显然,很多代码要在两者之间共享,并且一些代码严重依赖于 .NET 框架项,例如 sqlite-net 库。

在 2 个项目之间共享代码的最佳方式 (afaik) 是使用 PCL——这样可以在解决方案中使用来自 iOS 和 Android 项目的共享代码来引用项目,并重新编译和链接所有内容很好的方式。

但是,在 MonoDevelop 中创建的 PCL 是使用 gmcs 编译器编译的,并且在这种情况下无法构建一些外部依赖项(即在这种情况下使用的框架缺少System.Func<T, TResult>,仅提供System.Func<T1, T2, ..., T9, TResult>)。MonoTouch 的编译器 (smcs) 能够完美地编译 PCL(通过将 gmcs 二进制替换为 smcs 二进制来证明)。根据我在谷歌搜索后发现的结果,gmcs 使用 2.0 .NET 框架,而 smcs 使用称为 2.1 框架的 smth,它实际上是最近的 .NET 的混合体。

问题来了:在 MonoDevelop 中构建 PCL(作为另一个项目的依赖项)时,是否可以指定使用哪个编译器?

4

2 回答 2

16

Mono 还没有实际 PCL 库的实现。目前,它有一个虚拟的 Microsoft.Portable.CSharp.targets 文件,它会覆盖框架和目标以针对 MonoTouch、Android 的 Mono 或 .NET 4.0 构建库,具体取决于安装的内容。

使用 MonoTouch 框架的代码路径中似乎存在错误 - 它使用默认的公共目标 Microsoft.CSharp.targets,而没有覆盖编译器以使用 MonoTouch 特定版本的 C# 编译器。这是必要的,因为 Mono 的 C# 编译器当前是特定于框架的(尽管这在 Mono 2.12 中已修复,它是 alpha 版本)。

您可以通过编辑文件来解决此问题/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild/Microsoft/Portable/v4.0/Microsoft.Portable.CSharp.targets,找到设置的 PropertyGroup

<TargetFrameworkIdentifier>MonoTouch</TargetFrameworkIdentifier>

并为此添加以下行:

<CscToolExe>smcs</CscToolExe>
<CscToolPath>/Developer/MonoTouch/usr/bin</CscToolPath>
于 2012-08-21T20:31:48.597 回答
1

我知道这是一个老问题,但似乎在 3.0.x 版本中向 Mono 添加了可移植类库 (PCL) 支持,有关详细信息,请参阅发行说明,特别是3.0.8版本:

将 PCL 支持添加到 xbuild,mono 的 MSBuild 实现。

于 2015-01-16T20:54:54.467 回答