如何最好地针对多个版本的.NET框架进行定位?

27 浏览
0 Comments

如何最好地针对多个版本的.NET框架进行定位?

我正在构建一个类库,并将其部署为NuGet包,这个包允许我根据项目所添加的.NET框架版本选择不同的程序集作为引用。这是一个非常好的功能,但我想知道是否有可能有一个单独的类库项目,并针对多个.NET框架版本进行构建?

如果可能的话,我更希望避免以下情况:

MyLibrary40.dllMyLibrary45.dll,因为这两个项目将不得不共享很多代码。4.5版本将提供async函数,这是一个4.5的功能。

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

如果我在C++中工作,我可能会使用多个配置和#if块来控制只在一个配置中支持的函数,但我担心这会导致我拥有两个名称相同但功能不同的程序集。

提前感谢!

0
0 Comments

如何同时针对多个版本的.NET框架进行目标定位?

在同一文件夹中添加另一个.csproj文件,并将其配置为构建不同的框架版本是一种简单的方法。这样做可以避免添加文件链接,因为这两个项目本质上是对同一文件夹结构的视图。

假设你有以下结构:

- MyLibrary\

- MyLibrary.sln

- MyLibrary\

- MyLibrary.csproj

- Program.cs

在同一文件夹中复制MyLibrary.csproj并进行编辑以更改一些内容:

- 为该元素的值创建一个新的GUID

- 在这里指定替代版本,例如:v4.5或v3.5

- (对于Debug和Release)将其设置为唯一路径,例如bin\Debug\net45和bin\Debug\net45,以使每个项目的输出位于唯一位置

你还必须在非条件的元素中添加一个新元素,以便在并行构建期间两个项目不会发生在obj文件夹中的冲突。这是很重要的,可以防止奇怪的竞争条件错误。

最后,将这个新项目添加到现有的解决方案中。

这种方法与定义编译开关(如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包还是会下载所有可用版本。

0
0 Comments

问题的原因是在使用.NET框架的不同版本时,需要找到一种最佳方法来解决相关问题。解决方法是使用Shared Project来代替逐个添加文件的方式,但这种方法有一些限制,其中最明显的限制是类库不能引用不是Shared Project的项目。然而,在某些情况下,这种方法可能不是很有用,因为并非所有的NuGet包都是Shared Project。

在VS2015和VS2017中,可以创建一个共享库A和一个引用A和Newtonsoft NuGet包的类库B。然后可以在A中编写使用JObject的代码。

0
0 Comments

在开发过程中,可能需要同时针对不同版本的.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

0