多个定位框架中的源代码

时间:2019-12-04 03:28:56

标签: c# .net-core .net-standard multitargeting

我有一个包含3个项目的解决方案( NetCoreWeb NetFrameworkWeb SharedLibrary

  • NetCoreWeb .Net Core 2.2
  • NetFrameworkWeb Net Framework 4.5.2
  • SharedLibrary NetCoreApp 2.2 Net Framework 4.5.2

enter image description here

这是 SharedLibrary 项目中的 MessageService.cs 中的源代码:

public class MessageService
    {
        public string GetMessage()
        {
#if NETFRAMEWORK
            return "Net Framework";
#elif NETSTANDARD
            return "Net Standard";
#else
            return "Not supported";
#endif
        }
    }

每次,即使我将 NetFrameworkWeb 设置为活动项目,也只有 #elif NETSTANDARD 中的源代码处于活动状态并且可用于调试。

enter image description here

在将 NetFrameworkWeb 设置为活动项目时,如何使 #if NETFRAMEWORK 块中的源代码处于活动状态,而在< strong> #elif NETSTANDARD 设置为活动状态?

谢谢

1 个答案:

答案 0 :(得分:0)

#if *语句是编译时定义。由于您的库仅针对.NET Standard(据我从屏幕快照和描述的行为所知),因此源代码是使用NETSTANDARD常量编译的。

然后,在您的.NET Core和.NET Framework项目中使用此结果二进制文件,因此字符串值不会更改,因为它们是在其他项目中使用的。

如果您绝对需要针对不同的运行时实现不同的行为,则需要通过将库的csproj文件从以下位置更改,将库设置为多目标项目而不是.NET Standard项目。

<TargetFramework>netstandard2.0</TargetFramework>

<TargetFrameworks>netcoreapp2.2;net452</TargetFrameworks>

(请注意s中的附加TargetFrameworks