我已经看到了关于这个问题的几个讨论,但我还没有看到明确的答案,当然不是的MonoTouch /单声道为Android。
我正在开发一个基于Xamarin的多目标的解决方案,自然我有很多共同的代码。 理想情况下,该代码将驻留在一个“共同”标准.NET类库项目(或项目)。 当我引用特定于平台的项目这个项目中,我得到了警告,“该项目的共同“不能被引用。引用的项目针对的是不同的框架家族(.NETFramework)”,但解决方案仍成功编译。
从本质上讲,我问,如果当我的公共代码是解决多目标我必须使用文件链接的方法。 详细地说,我的问题是:
- 是上述方法有效,当我的“共同”项目中引用仅由单*目标支持组件?
- 如果答案以上是肯定的:说我引用第三方.NET库(DLL中的,而不是一个项目的形式),在我的“普通”项目,该库确实有不同的目标,不同的组件(但不引用不单*支持的组件),我仍然可以参考组件的Windows版本,并摆脱它?
有一种叫做便携式类库已在其一段时间的方式。 使用Visual Studio 2012(发布2012-09-12)开始,它是Visual Studio中的一等公民,让您可以在Windows 8,Windows Phone的,Silverlight中的Windows <8等之间共享库
我希望MonoDevelop中遵循这一轨迹被便携式库可以共享也支持Mono 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文件。
这个工作对我们非常好。
MonoTouch的,像单为Android,提供了常规的 (桌面).NET框架的一个子集。
该子集实际上是运Silverlight的基类库(BCL)(也就是我们俗称的时候FX 2.1)的超集。
你必须有1或2个问题,如果你的二进制文件引用类型,方法,做(任何元数据)不MonoTouch的(或单声道Android设备)的存在。
随着MonoTouch的建设设备时,你会发现这样的问题,因为AOT使用(提前)编译。 督察失踪符号会发现在构建时。 请注意,在JIT用于iPhone模拟器,直到它们在运行时必需的,这样丢失的符号将不会被发现 。
单为Android使用JIT(无论在设备和仿真器),所以任何丢失的元数据更可能在运行时被发现-即管理连接器也将找到失踪成员,将无法如创建新的,小的,组件符号不能得到解决。
所以没有方法是不正确(如100%安全),使用随产品的SDK组件(BCL),除非你重新编译代码。
文章来源: Project reference vs. file links in Mono multi-target projects