我们正在启动一个跨平台项目,以部署到Android和iOS。显然,很多代码都要在两者之间共享,而一些代码在很大程度上依赖于.NET框架项,比如sqlite-net库。
在两个项目之间共享代码的最佳方式(afaik)是使用PCL - 这样就可以在解决方案中使用来自iOS和Android项目的共享代码来引用项目并重新编译所有内容以一种很好的方式联系起来。
但是,使用gmcs编译器编译在MonoDevelop中创建的PCL,并且在这种情况下无法构建一些外部依赖项(即,在这种情况下使用的框架缺少System.Func<T, TResult>
,仅提供System.Func<T1, T2, ..., T9, TResult>
) 。反过来,MonoTouch的编译器(smcs)能够完美地编译PCL(通过用smcs二进制替换gmcs二进制文件证明)。根据我在谷歌搜索后发现的内容,gmcs使用2.0 .NET框架,而smcs使用名为2.1框架的smth,这实际上是最新.NET的混合体。
问题是:在MonoDevelop中构建PCL(作为另一个项目的依赖项)时,是否可以指定使用哪个编译器?
答案 0 :(得分:16)
Mono还没有实际PCL库的实现。目前,它有a dummy Microsoft.Portable.CSharp.targets file而是覆盖了框架和目标,根据安装的内容,依次按照MonoTouch,Mono for Android或.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>
答案 1 :(得分:1)
我知道这是一个老问题,但似乎在3.0.x版本的Mono中添加了可移植类库(PCL)支持,有关详细信息,请参阅Release Notes,特别是版本3.0.8:
为xbuild,mono的MSBuild实现添加了PCL支持。