什么';是针对.NET框架的多个版本的最佳方法
本文关键字:版本 方法 最佳 框架 NET 什么 | 更新日期: 2023-09-27 18:23:39
我正在构建一个类库,我将为它部署一个NuGet包,它允许我根据添加到的项目的.NET框架版本选择不同的程序集作为引用添加。这是一个非常好的功能,但我想知道的是,是否有可能拥有一个类库项目,并针对.NET框架的多个版本构建它?
我宁愿避免:
MyLibrary40.dll
和MyLibrary45.dll
如果可能的话,因为这两个项目必须共享大量代码。4.5版本将提供async
功能,这是4.5的一项功能。
有人知道最好的方法是什么吗?我可以使用多个内部版本配置吗?还是我必须走单独的项目路线?
如果我在C++中工作,我可能会在一个配置中只支持的函数周围使用多个配置和#if
块,但我担心这会导致我有两个同名的程序集来做不同的事情。
提前感谢!
您至少需要一个带有两个项目的VisualStudio解决方案(一个用于.net 4,一个用于.net 4.5)。
将所有代码文件添加到.net 4项目,在另一个项目中,您将代码文件添加为链接(使用"Add Existing Item..."
-对话框并选择Add as link
)
现在,您可以将.NET 4.5的所有代码和类添加到您的4.5项目.中
此外,您应该为项目定义自己的编译器开关(条件编译符号)。比如你的.net 4项目的NET4和你的.net 4.5项目的NET4.5)
您可以在项目设置中的Build->General->Conditional Compilation switches 下设置开关
在您的代码中,您可以使用以下开关为.NET 4或.NET 4.5 生成代码
#if NET4
// code only for .NET 4
#endif
// code for all framework versions.
#if NET45
// code only for .NET 4.5
#endif
一个简单的方法是在同一文件夹中添加另一个.csproj
文件,并将其配置为构建不同的框架版本。这避免了添加文件链接,因为两个项目本质上都是同一文件夹结构上的视图。
假设你有这样的结构:
- MyLibrary'
- MyLibrary.sln
- MyLibrary'
- MyLibrary.csproj
- Program.cs
将MyLibrary.csproj
复制到同一个文件夹并编辑以更改一些内容:
<ProjectGuid>
只是为该元素的值创建一个新的GUID<TargetFrameworkVersion>
在此指定替代版本,例如:v4.5
或v3.5
<OutputPath>
(用于调试和发布)将其设置为唯一路径,如bin'Debug'net45
和bin'Debug'net45
,以允许每个项目的输出最终位于唯一位置
您还必须向非条件<PropertyGroup>
元素添加一个新元素,这样在并行生成期间,两个项目就不会在obj
文件夹中发生冲突。这很重要,可以防止奇怪的种族条件错误。
<PropertyGroup>
<BaseIntermediateOutputPath>obj'net45'</BaseIntermediateOutputPath>
最后,将这个新项目添加到现有的解决方案中。
这种方法与定义编译开关(如NET35
和NET45
)以及使用#if NET35
/#endif
指令协同工作。
使用此技术的两个开源项目是MetadataExtractor和NetMQ。你可以参考他们,以防遇到麻烦。
我知道这个老问题,当时这个答案不合适。。。但现在可以使用共享项目,这在逻辑上与添加项目作为链接而不是单独添加每个文件相同。
如果是现在,您可以创建"SDK风格的项目"MSDN