为 Xamarin 项目编译 C# 库

Compiling C# library for Xamarin project

我对 Xamarin 和整个 C#/.NET 世界还很陌生。我计划使用 Xamarin 开发一个跨平台应用程序,我将需要创建库以与其他开发人员共享。我听说过 PCL,但有些限制让我有点不爽。例如,我不能使用 System.Net,即使我可以直接在 iOS 或 Android 项目中使用它。

我知道,例如,System.Net 在 iOS 项目中的编译方式与在 Android 项目中的编译方式不同,这是我无法使用的原因之一它在 PCL 中。但是,是否可以编写一个库,然后为每个平台编译它?

另一方面,共享项目让我来做。但是我不能把它作为图书馆分享。

所以,我想做的是只维护一个代码。一次编写,两次编译,运行无处不在(手机上,除了WindowsPhone)。

所以,问题是:

有没有可能实现这样的事情?

.NET Core 和 .NET Platform Standard 即将推出,您应该检查一下。他们是未来取代PCL.

我已经将#SNMP 库部分移植到 .NET Core RC1 并希望在 RC2 和以后出现时迁移其余部分,

https://blog.lextudio.com/2016/03/how-to-port-snmp-library-to-net-core/

你可以做的是使用编译器指令来区分你正在为哪个平台开发..不幸的是,这并不能减少为不同平台编写两次不同代码的事实,因为你需要不同的库在平台上做同样的事情不同的平台。

使用这些指令,您可以为指定平台编译每个库或您自己的库。

您应该为 iOS 和 Android 创建一个 Class 库。然后,您只在其中一个中编写代码,并将代码文件 link 写入另一个 Class 库。这样,您只需编写一次代码,编译每个 Class 库,然后从相同的代码中获得 2 个 DLL 库。

在我们的 Desktop/Android/IPhone 项目中,我们使用了下一种方法:

假设我们有下一个项目

  • 机器人
  • 触摸
  • Common.PCL
  • Common.Shared

Droid 和 Touch 项目引用 PCL 和共享库。 接下来,在Common.PCL

中创建一个接口
namespace Common.PCL
{
    public interface INetSpecificFactory
    {
        INetSpecific CreateSomething();
    }
}

及其在 Shared 中的实现

using Common.PCL;

namespace Common.Shared
{
    public class NetSpecificFactory : INetSpecificFactory
    {
        public INetSpecific CreateSomething()
        {
            ....
        }
    }
}

在共享库中添加 autofac 模块

using Common.PCL;
namespace Common.Shared
{
    public class AutofacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<NetSpecificFactory>().As<INetSpecificFactory>();
        }
    }
}

所以,我可以通过 DI 在 PCL 中使用 INetSpecificFactory。这比使用 link 文件要好(最初是其中一个选项)