如何最好地针对多个版本的.NET框架进行定位?
如何最好地针对多个版本的.NET框架进行定位?
我正在构建一个类库,并将其部署为NuGet包,这个包允许我根据项目所添加的.NET框架版本选择不同的程序集作为引用。这是一个非常好的功能,但我想知道是否有可能有一个单独的类库项目,并针对多个.NET框架版本进行构建?
如果可能的话,我更希望避免以下情况:
MyLibrary40.dll
和MyLibrary45.dll
,因为这两个项目将不得不共享很多代码。4.5版本将提供async
函数,这是一个4.5的功能。
有人知道最佳方法是什么吗?我可以使用多个构建配置吗?还是必须使用单独的项目路线?
如果我在C++中工作,我可能会使用多个配置和#if
块来控制只在一个配置中支持的函数,但我担心这会导致我拥有两个名称相同但功能不同的程序集。
提前感谢!
如何同时针对多个版本的.NET框架进行目标定位?
在同一文件夹中添加另一个.csproj文件,并将其配置为构建不同的框架版本是一种简单的方法。这样做可以避免添加文件链接,因为这两个项目本质上是对同一文件夹结构的视图。
假设你有以下结构:
- MyLibrary\
- MyLibrary.sln
- MyLibrary\
- MyLibrary.csproj
- Program.cs
在同一文件夹中复制MyLibrary.csproj并进行编辑以更改一些内容:
-
-
-
你还必须在非条件的
最后,将这个新项目添加到现有的解决方案中。
这种方法与定义编译开关(如NET35和NET45)以及使用#if NET35 / #endif指令相辅相成。
两个使用此技术的开源项目是MetadataExtractor和NetMQ。如果遇到问题,你可以参考它们。
如果你使用Visual Studio 2015,是否仍然需要按照这个答案的方法?或者现在是否有更好的方法来做到这一点?只是好奇。
我在Visual Studio 2015中使用了这种方法。然而,一旦xproj/project.json相关的东西出现,那可能会是一种更好的同时针对多个平台的方法。
谢谢你的快速回答...我会记住这个方法的。
“将MyLibrary.csproj复制到同一文件夹中”——这听起来好像任何对一个.csproj文件的更改(添加文件)都必须手动在另一个文件中进行同样的更改,这听起来像是一种容易出错的方法。
.R.Mapper,是的,它并不完美。如果你很幸运,一个项目将无法构建。否则,你可能会遗漏一个文件。然而,在某些情况下,你需要这样做——也许你为一个目标版本缺失的东西提供了一个包装类。如果你知道更好的解决方案,我愿意听取。
.R.Mapper如果你使用接受的答案添加任何文件,你仍然必须记住在任何其他项目中链接它们。
:这是正确的,但我可能仍然更喜欢通过条件编译来排除声明包装类的文件内容,而不是为不同的目标版本使用不同的项目文件。
:确实,接受的答案在这方面没有优势。
如果你的项目使用NuGet包作为依赖项,这将与packages.config文件产生冲突(因为它包含对你的项目所需版本的引用,而且它不能有除“packages.config”之外的任何其他名称)。我不能确定这是否会引起任何问题,因为NuGet包还是会下载所有可用版本。
在开发过程中,可能需要同时针对不同版本的.NET框架进行目标定位。下面是一种解决方法:
首先,你需要创建一个包含两个项目的Visual Studio解决方案,其中一个项目针对.NET 4,另一个项目针对.NET 4.5。
将所有代码文件添加到.NET 4项目中,然后在另一个项目中将代码文件作为链接添加(使用“添加现有项...”对话框,并选择“添加为链接”)。
现在,将所有用于.NET 4.5的代码和类添加到你的4.5项目中。
此外,你应该为你的项目定义自己的编译器开关(条件编译符号)。例如,对于.NET 4项目,定义NET4开关,对于.NET 4.5项目,定义NET4.5开关。
你可以在项目设置的“生成”-“常规”-“条件编译开关”下设置这些开关。
在代码中,你可以使用这些开关来生成适用于.NET 4或.NET 4.5的代码:
#if NET4
// 仅适用于.NET 4的代码
#endif
// 适用于所有框架版本的代码
#if NET45
// 仅适用于.NET 4.5的代码
#endif
感谢你的回答,这确实是我采取的方法。我有一个名为'JsonClient'的.NET Framework 4.5类库,它具有所有功能。.NET 4.0版本称为'JsonClientLite',包含完全相同的代码,但是它没有使用条件编译,而是为每个带有异步方法的类单独创建了一个文件(因此在主文件夹中有JsonClient.cs,在.NET 4.0版本中只有JsonClientAsync.cs)- 我在.NET 4.0版本中使用文件的快捷方式,就像你描述的那样。我对这种方法很满意,它似乎是一种干净的方法- 非常感谢你的回答!我编写了一个名为CodeLinker的工具来解决这个问题- 它可以将现有项目的项目项复制到新项目中。github.com/CADbloke/CodeLinker