[英]Multiple platform projects and 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包。
如果我在可移植项目中添加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依赖项的正确引用?
对于这种情况,最简单的解决方案是通过一个链接创建为每个项目不同的文件夹和包含的.cs -files。 (请参阅MSDN-添加为链接 )
这样做使您可以为不同平台(项目)引用不同的软件包(和版本),因为您具有不同的packages.config -files。
此外,我应该提到,您可能会遇到不兼容的框架方法(例如Task.Factory.StartNew
的Task.Factory.StartNew和Task.Run
的Task.Run),可以通过两种不同的方法解决:
使用编译器常量
在项目中定义一个恒定的框架,并使用preprocessor-directives查询它们,例如:
#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
-statements),在调试时逐步执行更为自然,最后这种方法对于复杂的场景更灵活。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.