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);
        }
    }
}

MonoDroid和MonoTouch的共享库

在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(可移植类库),因为它的灵活性。