为 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 文件要好(最初是其中一个选项)
我对 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 文件要好(最初是其中一个选项)