什么是最好的方式来定位多个版本的.NET框架?
我正在构build一个类库,我将把它部署到一个NuGet包中,这使我可以根据添加的项目的.NET框架版本,select不同的程序集作为参考添加。 这是一个很好的function,但是我想知道的是,是否有可能拥有一个类库项目,并针对多个.NET框架版本进行构build?
我宁愿避免有:
MyLibrary40.dll
和MyLibrary45.dll
如果可能的话,因为这两个项目将不得不分享大量的代码。 4.5版本将提供async
function,这是4.5的function。
有谁知道这是最好的方法是什么? 我可以使用多个构buildconfiguration吗? 还是我必须走下单独的项目路线?
如果我在C ++中工作,我可能会在一个configuration中仅支持的函数中使用多个configuration和#if
块,但是我担心这会导致我有两个具有相同名称的程序集执行不同的操作。
提前致谢!
您至less需要一个Visual Studio解决scheme,其中包含两个项目(一个用于.net 4,一个用于.net 4.5)。
将所有代码文件添加到.net 4项目,并在其他项目中添加代码文件作为链接(使用"Add Existing Item..."
对话框,并selectAdd as link
)
现在,将.NET 4.5的所有代码和类添加到4.5项目中。
另外,你应该为你的项目定义自己的编译器开关(条件编译符号)。 NET4为您的.net 4项目和NET4.5为您的.net 4.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
文件,并将其configuration为构build不同的框架版本。 这避免了必须添加链接到文件,因为这两个项目基本上是在相同的文件夹结构的意见 。
假设你有这样的结构:
- MyLibrary\ - MyLibrary.sln - MyLibrary\ - MyLibrary.csproj - Program.cs
将MyLibrary.csproj
复制到相同的文件夹并编辑以更改一些内容:
-
<ProjectGuid>
只是为这个元素的值创build一个新的GUID - 在这里指定替代版本,例如:
v4.5
或v3.5
-
<OutputPath>
(用于debugging和发布)将其设置为独特的path,如bin\Debug\net45
和bin\Debug\net45
,以允许每个项目的输出结束在一个独特的位置
您还必须在非条件<PropertyGroup>
元素中添加一个新元素,以便两个项目在并行构build期间不会在obj
文件夹中发生冲突。 这是重要的,并防止古怪的种族条件错误。
<PropertyGroup> <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>
最后,将这个新项目添加到您现有的解决scheme中。
这种方法与定义编译开关(如NET35
和NET45
)以及使用#if NET35
/ #endif
指令一起工作。
两个使用这种技术的开源项目是MetadataExtractor和NetMQ 。 如果你遇到麻烦,你可以参考他们。
老问题,我知道,这不是一个合适的答案在当时…但现在可以使用共享项目,这在逻辑上是相同的项目添加链接,而不是每个文件单独。