多个平台项目和NuGet

时间:2016-09-08 14:18:36

标签: c# .net nuget

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

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

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

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

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

如果我在Portable项目中添加NuGet包,它将在packages.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" />

有没有办法有一个单独的packages.config所以每个项目都包含对我的NuGet依赖项的正确引用?

1 个答案:

答案 0 :(得分:1)

此方案最简单的解决方案是为每个项目创建不同的文件夹,并通过链接包含 .cs 文件。 (见https://pypi.python.org/pypi/pyserial

这样做可以让您为不同的平台(项目)引用不同的包(和版本),因为您有不同的 packages.config -files。

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

使用编译器常量

在项目中定义框架常量,并使用MSDN - Add as Link查询它们,如:

#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 - 语句),而调试时的步进更自然,最后,这种方法对于复杂的场景更加灵活。