多平台项目和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依赖?
最简单的解决方案是为每个项目创建不同的文件夹,并通过链接包含.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
-语句),在调试时分步更自然,最后这种方法对于复杂的场景更灵活。