C# 有没有办法在一个文件中使用多版本的.NET framework代码?

C# 有没有办法在一个文件中使用多版本的.NET framework代码?,c#,.net,C#,.net,i、 在PHP中,您可以在一个文件中构建一个方法库,只有在执行过程中出现问题时(而不是在编译器中),才会给出错误。我想知道在C#中是否可能出现类似的情况,例如,我可以将.NET 3.5和4.5的专用方法放在同一个文件中: //myFile.cs public void mymethod_for_v35(object profile) public async void mymethod_for_v45(dynamic profile) 因此,我可以在所有项目中包括myfile.cs(无论目

i、 在PHP中,您可以在一个文件中构建一个方法库,只有在执行过程中出现问题时(而不是在编译器中),才会给出错误。我想知道在C#中是否可能出现类似的情况,例如,我可以将.NET 3.5和4.5的专用方法放在同一个文件中:

//myFile.cs

public void mymethod_for_v35(object profile)

public async void mymethod_for_v45(dynamic profile)
因此,我可以在所有项目中包括
myfile.cs
(无论目标是3.5还是4.5),当我目标是3.5时,在应用程序中,我将只调用第一个方法。然而,由于第二种方法适用于4.5(而3.5网络编译器不理解这一点),我们仍然会在IDE中遇到编译错误


是否存在允许该方法存在的任何变通方法或标志(即使当前.NET版本的project不支持该方法)?

实现这一点最方便的方法是通过新的SDK项目语法(CSP)使用多目标库;首先创建一个.NET标准库,然后将
更改为
,只需用分号分隔需要单独支持的框架,例如:

<TargetFrameworks>net40;netstandard1.3;netstandard2.0</TargetFrameworks>
#if NET40
...
#endif 

(请注意,
被映射到

这意味着适当的API曲面将自动浮出水面

如果需要对不同的目标框架使用不同的引用,也可以通过项目组上的条件在项目文件中完成:

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="..."/> <!-- whatever you need here -->
</ItemGroup>


在构建时,将对每个目标框架进行评估(包括条件)并单独构建,然后在创建nupkg时将其捆绑在一起。

实现这一点最方便的方法是通过新的SDK项目语法(CSP)使用多目标库;首先创建一个.NET标准库,然后将
更改为
,只需用分号分隔需要单独支持的框架,例如:

<TargetFrameworks>net40;netstandard1.3;netstandard2.0</TargetFrameworks>
#if NET40
...
#endif 

(请注意,
被映射到

这意味着适当的API曲面将自动浮出水面

如果需要对不同的目标框架使用不同的引用,也可以通过项目组上的条件在项目文件中完成:

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="..."/> <!-- whatever you need here -->
</ItemGroup>


在构建时,将对每个目标框架进行评估(包括条件)并分别构建,然后在创建nupkg时将其捆绑在一起。

您可能需要有不同版本的程序集,每个.Net版本对应一个。但是除非它做了一些根本不同的事情,否则你可以在4中使用3.5版本。5@phuzi我试图避免使用不同的程序集…使用条件编译符号。对于.NET3.5项目定义一些符号(如“NET35”),对于.NET4.5项目定义另一个符号(“NET45”)。然后使用#if NET35指令等。由于缺少支持类,该语言较新版本中的某些结构甚至无法为较低版本编译,因此一般来说,不可能生成一个在任何地方都能正常工作且仍支持较新功能的程序集(无需使用运行时代码生成之类的方法)。
async
/
await
无疑是其中之一,就像
dynamic
一样。您可以有一个代码库(在项目文件中使用条件编译或条件包含),但在这种情况下,拥有一个二进制文件并不是一个现实的目标。@Jeroenmoster您可以作为答案提交,我喜欢它。您可能需要有不同版本的程序集,每个版本的.Net都有一个。但是,除非它做了一些根本不同的事情,否则您可以在4中使用3.5版本。5@phuzi我试图避免不同的行为组件…使用条件编译符号。对于.NET3.5项目定义一些符号(如“NET35”),对于.NET4.5项目定义另一个符号(“NET45”)。然后使用#if NET35指令等。由于缺少支持类,该语言较新版本中的某些构造甚至无法针对较低版本进行编译,因此一般来说,不可能生成一个在任何地方都能正常工作且仍支持较新功能的程序集(无需使用运行时代码生成之类的方法)。
async
/
await
无疑是其中之一,就像
dynamic
一样。您可以有一个代码库(在项目文件中使用条件编译或条件包含),但在这种情况下,拥有一个二进制文件并不是一个现实的目标。@Jeroenmoster您可以提交作为答案,我喜欢它。