MonoDroid和MonoTouch的共享库
本文关键字:共享 MonoTouch MonoDroid | 更新日期: 2023-09-27 17:49:45
所以我的公司完全来自c# . net环境,所以我们很自然地将Mono用于移动开发。我们有一个非常广泛的windows平台库,我能够将其大部分移植为Android类库。我们的想法是,这个Android类库将是我们的移动平台库,可以在未来的MonoTouch中重用(还没有测试,但阅读MonoTouch项目可以引用Android类库,只要没有Android特定的代码)。在库中,有大量的日志记录语句,对于windows环境来说,它们最终只是跟踪语句(包装在自定义助手类中)。我们希望保留日志记录语句,并基于当前环境(iOS或Android),只需将其转换为本机日志记录。
我计划在移动平台库中使用部分声明进行日志记录,并让Android和iOS特定的库包含这些部分日志记录方法的实现。但是,当我意识到部分不能在组件之间工作时,这种情况就崩溃了。
所以现在我不知道该怎么做。我唯一能想到的就是拥有两个独立的iOS和Android平台库并链接相同的文件。(Xamarin可能有一个日志类来做这件事,但我们仍然需要为任何其他未来的抽象提出一个模式)
任何建议都是感激的。我们仍处于实验/计划阶段,所以我们可能会忽略一些东西,如果是这种情况,请告诉我们。
谢谢。
编辑
假设我有以下简单的静态类:
public static class TraceHelper
{
public static void WriteLine(string message)
{
// Validation and preprocessing
Trace.WriteLine(message);
}
}
我在移动平台库中有数百个对这个方法的调用。现在让我们说我在我的Android应用程序中引用这个库,有没有办法覆盖TraceHelper.WriteLine()的实现而不修改库本身?
更新
我们最终创建了Android和iOS库,实现了缺失的。net功能。只需将本机等效功能包装在相同的。net名称空间和类中。例:
using Android.Util;
namespace System.Diagnostics
{
public static class Trace
{
#region Non-Public Data Members
private const string Tag = "Trace";
#endregion
public static void WriteLine(string message)
{
Log.WriteLine(LogPriority.Verbose, Tag, message);
}
}
}
在mvvmcross中,我已经使用接口解决了这个问题。
我已经声明了一个通用IMvxTrace接口,然后我添加了一个单例实现,如:
https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Platform/Diagnostics/MvxTrace.cs这个单例使用底层的_realTrace实现。
在droid上,_realTrace是:
https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Platform/MvxDebugTrace.cs对于touch, _realTrace是:
https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Platform/MvxDebugTrace.cs同样在wpf, win8和wp上也有自定义实现
我已经使用文件链接(在master中)完成了这一点,但最近使用pcl和平台特定库的混合。我的个人偏好是pcl,因为我喜欢使用重构工具——这些工具在pcl中比在#if代码中工作得更好。此外,当我的代码从1个平台扩展到6个平台时,我发现6组#if语句太复杂而难以维护。
请注意,上面的代码还使用了依赖注入和IOC技术。我发现这对跨平台代码共享非常有帮助。有几个可移植的IOC库,包括tinyioc、xplatutils、opennetcf和mvvmcross的简单IOC。解决这个问题最简单的方法是创建一个iOS项目,你可以这样做:
public static class TraceHelper
{
public static void WriteLine(string message)
{
#if MONOTOUCH
Console.WriteLine(message);//or something else
#else
Trace.WriteLine(message);
#endif
}
}
您将创建一个MonoTouch类库项目,并"链接"来自您的原始Mono Android项目的所有文件。如果需要的话,你可以设置一个MONOTOUCH
编译器标志来拥有特定的iOS或Android代码。
我们一直采用这种方法,有时更喜欢而不是使用pcl(可移植类库),因为它的灵活性。