MonoDroid和MonoTouch的共享库

Ale*_*lex 5 c# shared-libraries xamarin.ios 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在移动平台库中有数百个调用此方法的方法.现在让我说我在我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*art 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 库,包括tiniioc、xplatutils、opennetcf 和 mvvmcross 的简单 IOC。