多平台项目和NuGet

本文关键字:NuGet 项目 平台 | 更新日期: 2023-09-27 18:06:17

我已经创建了一个库,我需要能够在可移植类库以及常规的。net应用程序中使用它。我的方法是创建指向相同文件的多个解决方案/项目:

Src/
    Dismissile.sln
    Dismissile.Portable.sln
    Dismissile/
        Dismissile.csproj
        Dismissile.Portable.csproj
        Class1.cs

Dismissile。sln包括反导弹。.NET Framework 4.5.2sln包含Dismissile.Portable.csproj,是一个面向。net Framework 4.5 Xamarin的可移植类库项目。Android和Xamarin.iOS.

每个项目包含Class1.cs。我在每个项目中都创建了一些条件编译符号,如PORTABLE和NET452。

这似乎工作得很好,但现在我需要为JSON添加一个NuGet包。. NET导入我的项目

如果我在我的Portable项目中添加一个NuGet包,它将在我的package .config中创建以下内容:

<package id="Newtonsoft.Json" version="9.0.1" targetFramework="portable40-net40+sl5+win8+wp8+wpa81" />

但是,如果我将它添加到我的其他项目中,它将在packages.config中创建以下内容:

<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net40" />

有没有办法单独包装?配置,使每个项目包括正确的引用我的NuGet依赖?

多平台项目和NuGet

最简单的解决方案是为每个项目创建不同的文件夹,并通过链接包含.cs-文件。(见MSDN -添加为链接)

这样做使您能够为不同的平台(项目)引用不同的包(和版本),因为您有不同的package .config-文件。

此外,我应该提到您可能会遇到不兼容的框架方法(例如NET40的Task.Factory.StartNew和NET45的Task.Run),这可以通过两种不同的方式解决:

使用编译器常量

在你的项目中定义一个框架常量,并使用预处理器指令来查询它们,比如:

#if NET40
Task.Factory.StartNew(...)
#elif NET45
Task.Run(...)
#endif

使用部分类和方法

Dismissile.NET40 ' FooClass.cs

public partial class Foo
{
  public void Bar()
  {
    // ...
    this.RunTask(task);
  }
  partial void RunTask(Task task);
}

Dismissile.NET40 ' Partial.FooClass.cs

public partial class Foo
{
  partial RunTask(Task task)
  {
    Task.Factory.StartNew(task);
  }
}

Dismissile.NET45 ' Partial.FooClass.cs

public partial class Foo
{
  partial RunTask(Task task)
  {
    Task.Run(task);
  }
}

我的首选解决方案是部分类和方法,因为它们不会用嵌套弄乱你的源代码(由于#if -语句),在调试时分步更自然,最后这种方法对于复杂的场景更灵活。