C# 什么';以.NET framework的多个版本为目标的最佳方法是什么?

C# 什么';以.NET framework的多个版本为目标的最佳方法是什么?,c#,.net,visual-studio-2012,C#,.net,Visual Studio 2012,我正在构建一个类库,并将它部署为一个NuGet包,它允许我根据添加到的项目的.NET framework版本选择要添加为引用的不同程序集。这是一个非常好的特性,但我想知道的是,是否有可能拥有一个单一的类库项目,并根据.NET framework的多个版本构建它 我宁愿避免: MyLibrary40.dll和MyLibrary45.dll 如果可能的话,因为这两个项目必须共享很多代码。4.5版将提供异步功能,这是4.5版的一项功能 有人知道这最好的方法是什么吗?我可以使用多个构建配置吗?还是我必须

我正在构建一个类库,并将它部署为一个NuGet包,它允许我根据添加到的项目的.NET framework版本选择要添加为引用的不同程序集。这是一个非常好的特性,但我想知道的是,是否有可能拥有一个单一的类库项目,并根据.NET framework的多个版本构建它

我宁愿避免:

MyLibrary40.dll
MyLibrary45.dll

如果可能的话,因为这两个项目必须共享很多代码。4.5版将提供
异步
功能,这是4.5版的一项功能

有人知道这最好的方法是什么吗?我可以使用多个构建配置吗?还是我必须走单独的项目路线

如果我在C++中工作,我可能会使用多个配置和<> > > >代码>在一个配置中只支持的函数周围,但是我担心这会导致我有两个具有不同名称的程序集。


提前谢谢

您将至少需要一个包含两个项目的VisualStudio解决方案(一个用于.net 4,一个用于.net 4.5)

将所有代码文件添加到.net 4-project中,并在另一个项目中将代码文件添加为链接(使用
“添加现有项…”
-对话框并选择
添加为链接

现在,将.NET 4.5的所有代码和类添加到4.5项目中

此外,您应该为项目定义自己的编译器开关(条件编译符号)。如.net 4-project中的NET4和.net 4.5-project中的NET4.5)

您可以在“项目设置”中的“生成->常规->条件编译开关”下设置开关

在代码中,您可以使用如下开关为.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
复制到同一文件夹,然后进行编辑以更改一些内容:

  • 只需为此元素的值创建一个新的GUID即可
  • 在此处指定替代版本,例如:
    v4.5
    v3.5
  • (用于调试和发布)将其设置为唯一路径,例如
    bin\Debug\net45
    bin\Debug\net45
    ,以允许每个项目的输出最终位于唯一的位置
您还必须将新元素添加到无条件的
元素中,以便在并行生成期间,两个项目不会在
obj
文件夹中发生冲突。这很重要,可以防止奇怪的竞态错误

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>

obj\net45\
最后,将此新项目添加到现有解决方案中

这种方法与定义编译开关(如
NET35
NET45
)并使用
#if NET35
/
#endif
指令协同工作


使用此技术的两个开源项目是和。如果你遇到麻烦,你可以参考他们。

我知道的老问题,而这在当时不是一个合适的答案。。。但是现在可以使用共享项目,这在逻辑上与将项目添加为链接(而不是单独添加每个文件)相同。

因此,您希望在一个程序集中针对不同的版本吗?这是获取BadImageException的最佳方法:)但是,我找到了一种编译方法,您可以查看我在问题中提出的链接,他们可能会对你的旅程有所帮助-@LarsKristensen,我想要一个项目文件,但能够生成两个程序集-一个支持.NET 4.0,另一个支持.NET 4.5并添加一些异步函数-而不必创建单独的项目..我也问了这个问题,没有给出严格的答案,也许你会有比我更好的答案,你需要的是configuration manager。。非常感谢,这确实是我走的路。我有一个名为“JsonClient”的.NETFramework4.5类库,它具有所有的特性。NET 4.0版本名为“JsonClient Lite”,包含完全相同的代码,但我没有使用条件编译,而是为每个类提供了一个单独的文件,其中包含异步方法(因此我在这两个类中都有JsonClient.cs,仅在主类中有JsonClient.cs)-我使用.NET 4.0版本中文件的快捷方式,正如您所述。我很高兴这是如何工作的,这似乎是一个干净的方式去-非常感谢你的回答!我写这篇文章就是为了解决这个问题——它用现有项目中的项目填充一个新项目。这个想法不错,但它有很多限制,最明显的是你的类库不能引用任何不是共享项目的东西。我想这是有道理的,但在每个NuGet包都是一个共享项目之前,在大多数情况下可能不会有用。嗯,不确定您在这里指的是什么。我可以创建一个共享库a和一个类库B,它引用了一个和Newtonsoft NuGet包。然后,我可以在使用例如JObject的。这在VS2015和VS2017中都是正确的,@DrewNoakes的答案在使用Visual Studio 2015时仍然有效吗?还是现在有更好的方法来做到这一点?只是想知道我在Visual Studio 2015中使用了它。然而,一旦xproj/project.json的东西落地,这可能是针对多个平台的更好方法。。。我会记住的。@O.R.Mapper,是的,这并不完美。如果幸运的话,一个项目将无法构建。否则您可能会丢失一个文件。然而,在某些情况下,您需要——也许您可以为一个目标版本中缺少的内容提供一个垫片类。如果你知道更好的解决办法,我洗耳恭听@