所以我的公司来自于一个完全C#.Net环境,所以我们自然而然地在寻找移动开发的Mono。我们有一个非常广泛的 Windows 平台库,我能够将其中的大部分移植为 Android 类库。这个 Android 类库将成为我们的移动平台库,将来可以为 MonoTouch 重复使用(尚未测试,但阅读 MonoTouch 项目可以引用 Android 类库,只要没有 Android 特定代码)。但是在库中,有很多日志记录语句,对于 Windows 环境,这些语句最终只是跟踪语句(包装在自定义帮助程序类中)。我们希望保留日志记录语句,并根据当前环境(iOS 或 Android),将其转换为 native 日志记录。
我计划在移动平台库中使用部分声明进行日志记录,并让 Android 和 iOS 特定库包含这些部分日志记录方法的实现。但当我意识到部分组件在程序集之间不起作用时,一切都崩溃了。
所以现在我不确定该怎么做。如果有两个独立的 iOS 和 Android 平台库并链接相同的文件,我唯一能想到的。 (Xamarin 可能有一个执行此操作的日志记录类,但我们仍然需要为任何其他 future 的抽象提出一个模式)
欢迎任何建议。我们仍处于实验/规划阶段,因此我们可能会忽略某些事情,如果是这样,请告诉我们。
谢谢。
编辑
假设我有以下简单的静态类。
public static class TraceHelper
{
public static void WriteLine(string message)
{
// Validation and preprocessing
Trace.WriteLine(message);
}
}
我在移动平台库中调用了数百次此方法。现在假设我在我的 Android 应用程序中引用了这个库,有没有什么方法可以在不修改库本身的情况下覆盖 TraceHelper.WriteLine() 的实现?
更新
我们最终创建了实现缺失的 .NET 功能的 Android 和 iOS 库。只需将 native 等效功能包装在相同的 .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 中,我使用接口(interface)解决了这个问题。
我已经声明了一个通用的 IMvxTrace 接口(interface),然后我添加了它的单例实现,例如:
此单例使用底层 _realTrace 实现。
在机器人上,_realTrace 是:
触摸时,_realTrace 是:
同样在wpf、win8、wp上也有自定义实现
我已经使用文件链接(在 master 中)完成了这一步,但最近使用了 PCL 和平台特定库的混合。我的个人偏好是 PCL,因为我喜欢使用重构工具 - 与使用 #if 代码相比,这些工具在 PCL 上的效果要好得多。此外,随着我的代码从 1 个平台增加到 6 个平台,我发现 6 组 #if 语句太复杂而无法维护。
请注意,上面的代码还使用了依赖注入(inject)和 IOC 技术。我发现这对跨平台代码共享非常有帮助。有几个可用的可移植 IOC 库,包括 tinyioc、xplatutils、opennetcf 和 mvvmcross 的简单 IOC。
关于c# - MonoDroid 和 MonoTouch 的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062194/