我创建了一个库,我需要能够在可移植类库以及常规.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依赖项的正确引用?
答案 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
- 语句),而调试时的步进更自然,最后,这种方法对于复杂的场景更加灵活。