我正在构建一个类库,我将部署一个NuGet包,它允许我根据它添加到的项目的.NET框架版本选择要添加的不同程序集作为引用。这是一个非常好的功能,但我想知道的是,是否有可能拥有一个类库项目,并针对.NET框架的多个版本构建它?
我宁愿避免:
MyLibrary40.dll
和MyLibrary45.dll
如果可能的话,因为这两个项目必须共享大量代码。 4.5版本将提供async
功能,这是4.5功能。
有谁知道最好的办法是什么?我可以使用多个构建配置吗?或者我必须沿着单独的项目路线走下去吗?
如果我在C ++中工作,我可能会使用多个配置和#if
围绕仅在一个配置中支持的功能,但我担心这会导致我有两个具有相同名称的程序集做不同的事情。
提前致谢!
答案 0 :(得分:36)
您至少需要一个包含2个项目的VisualStudio解决方案(一个用于.net 4,另一个用于.net 4.5)。
将所有代码文件添加到.net 4项目中,在另一个项目中添加代码文件作为链接(使用"Add Existing Item..."
- Dialog并选择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
答案 1 :(得分:15)
一种简单的方法是在同一文件夹中添加另一个.csproj
文件,并将其配置为构建不同的框架版本。这样就不必添加文件链接,因为这两个项目基本上都是 views 在同一个文件夹结构上。
说你有结构:
- MyLibrary\
- MyLibrary.sln
- MyLibrary\
- MyLibrary.csproj
- Program.cs
将MyLibrary.csproj
复制到同一文件夹并编辑以更改一些内容:
<ProjectGuid>
只需为此元素的值<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。如果您遇到麻烦,可以参考它们。
答案 2 :(得分:5)
老问题我知道,当时这不是一个合适的答案......但是现在可以使用共享项目,这在逻辑上与将项目添加为链接而不是单独添加每个文件相同。