Mono多目标项目中的项目参考与文件链接

时间:2012-09-10 11:59:40

标签: .net mono xamarin.ios xamarin.android

我已经看过一些关于这个问题的讨论,但我还没有看到明确的答案,当然不适用于Android的MonoTouch / Mono。

我正在开发一个基于Xamarin的多目标解决方案,当然我有很多常用代码。理想情况下,此代码将驻留在“通用”标准.NET类库项目(或项目)中。当我在特定于平台的项目中引用此项目时,我确实收到警告“项目'公共'不能被引用。引用的项目针对不同的框架系列(.NETFramework)”,但解决方案仍然成功编译。

基本上,当我的公共代码处理多个目标时,我问我是否必须使用文件链接方法。更详细地说,我的问题是:

  1. 当我的“常见”项目仅引用Mono *目标支持的程序集时,上述方法是否有效?
  2. 如果上面的答案是肯定的:假设我在我的“通用”项目中引用第三方.NET库(以DLL的形式,而不是项目),并且此库确实具有针对不同目标的不同程序集(但它没有引用Mono *不支持的程序集),我仍然可以引用程序集的Windows版本并侥幸逃脱它吗?

2 个答案:

答案 0 :(得分:1)

MonoTouch与Mono for Android一样,提供常规(桌面).NET框架的子集。

这个子集实际上是Silverlight(我们当时称为FX 2.1)的基类库(BCL)的超集。

如果您的二进制文件引用MonoTouch中不存在的类型,方法(任何元数据)(或Mono for Android),则会出现 1 2 的问题)。

使用MonoTouch时,您会在构建设备时发现此类问题,因为使用了AOT(提前)编译。在构建时将找到IOW缺少的符号。请注意,JIT用于iOS模拟器,因此在运行时需要它们之前,找不到

Mono for Android正在使用JIT(在设备和模拟器上),因此任何缺少的元数据都可能在运行时找到 - 即托管链接器也会找到缺少的成员而不会如果无法解析符号,则能够创建新的较小的装配体。

所以没有该方法无效(如100%安全),除非您使用产品附带的SDK程序集(BCL)重新编译代码。

答案 1 :(得分:1)

有一种称为可移植类库的东西已经存在了一段时间。从Visual Studio 2012(2012-09-12发布)开始,它现在是Visual Studio的一等公民,因此您可以在Windows 8,Windows Phone,Silverlight,Windows< 8等之间共享库。

我希望MonoDevelop能够遵循这条轨道,即使使用Mono for Android和MonoTouch,便携式库也可以共享。

同时,您应该为每个平台创建一个项目,即使链接到相同的源文件。我发现这是最好的解决方案:

项目文件名称如此

MyCompany.MyProduct.MyModule.Ios.csproj
MyCompany.MyProduct.MyModule.Android.csproj
MyCompany.MyProduct.MyModule.WinPhone.csproj

所有项目中的命名空间仅为MyCompany.MyProduct.MyModule。

链接到项目中相同的cs文件到“共享”文件夹。

如果需要在Ios版本中公开一些额外的类,只需将该文件添加到Ios项目(未链接),然后将.Ios添加到命名空间,因为您希望跨平台命名空间不会被平台混乱具体的东西。

这是一个不会破坏Windows路径长度问题的文件夹结构:

/MyCompany/MyProduct/

在这里,您可以为所有目标平台提供解决方案文件,如下所示:

MyCompany.MyProduct.Ios.sln
MyCompany.MyProduct.Wpf.sln
...

每个程序集的文件夹:

/MyCompany/MyProduct/MyModule/

这里为每个平台放置一个“共享”文件夹和一个文件夹,所以:

/MyCompany/MyProduct/MyModule/Shared/

仅跨平台代码(链接到每个项目文件)!!!

/MyCompany/MyProduct/MyModule/Android/
/MyCompany/MyProduct/MyModule/Ios/
/MyCompany/MyProduct/MyModule/WinPhone/
/MyCompany/MyProduct/MyModule/Wpf/
/MyCompany/MyProduct/MyModule/Mac/
...

这是您为模块的每个平台放置项目文件的位置,以及放置在特定平台上实现模块所需的任何特定于平台的cs文件的位置。

这对我们非常有用。