我已经看过一些关于这个问题的讨论,但我还没有看到明确的答案,当然不适用于Android的MonoTouch / Mono。
我正在开发一个基于Xamarin的多目标解决方案,当然我有很多常用代码。理想情况下,此代码将驻留在“通用”标准.NET类库项目(或项目)中。当我在特定于平台的项目中引用此项目时,我确实收到警告“项目'公共'不能被引用。引用的项目针对不同的框架系列(.NETFramework)”,但解决方案仍然成功编译。
基本上,当我的公共代码处理多个目标时,我问我是否必须使用文件链接方法。更详细地说,我的问题是:
答案 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文件的位置。
这对我们非常有用。