MonoDroid和MonoTouch的共享库

时间:2012-12-27 22:37:50

标签: c# xamarin.ios shared-libraries xamarin.android xamarin

所以我的公司来自一个完全C#.Net的环境,所以很自然地我们正在寻找Mono用于移动开发。我们有一个非常广泛的Windows平台库,我可以将其作为Android类库移植。我的想法是这个Android类库将成为我们的移动平台库,可以在未来重用MonoTouch(尚未经过测试,但只要没有Android特定代码,就可以读到MonoTouch项目可以引用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()的实现?

更新
我们最终创建了实现缺少的.NET功能的Android和iOS库。只需将本机等效功能包装在同一个.NET命名空间和类中。 EX:

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

2 个答案:

答案 0 :(得分:2)

在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

在触摸时,_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。

答案 1 :(得分:0)

解决此问题的最简单方法是设置一个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 for Android项目中的所有文件。然后,您可以设置MONOTOUCH编译器标志,以便在需要时具有特定的iOS或Android代码。

我们一直采用这种方法,并且更喜欢有时而不是使用PCL(便携式类库),因为它具有灵活性。