目标框架符号未定义

Posted

技术标签:

【中文标题】目标框架符号未定义【英文标题】:Target Framework Symbol not defined 【发布时间】:2019-02-11 11:20:51 【问题描述】:

我正在尝试使用 if 编译器指令有条件地包含一些早期版本的 .Net Framework 所需的代码,而不是更高版本。

我使用了来自 MSDN 的以下参考资料、@9​​87654321@ 参考资料和 Target Frameworks 参考资料。

我正在创作一个 .Net 4.5.1 应用程序,但似乎没有定义 NET451 符号,其他任何符号也没有。

我已经修改了 Target Frameworks MSDN 文章中的示例以包含所有框架符号,因此我可以看到定义了哪个。

#if NET20
        Console.WriteLine("Target framework: NET20");
#elif NET35
        Console.WriteLine("Target framework: NET35");
#elif NET40
        Console.WriteLine("Target framework: NET40");
#elif NET45
        Console.WriteLine("Target framework: NET45");
#elif NET451
        Console.WriteLine("Target framework: NET451");
#elif NET452
        Console.WriteLine("Target framework: NET452");
#elif NET46
        Console.WriteLine("Target framework: NET46");
#elif NET461
        Console.WriteLine("Target framework: NET461");
#elif NET462
        Console.WriteLine("Target framework: NET462");
#elif NET47
        Console.WriteLine("Target framework: NET47");
#elif NET471
        Console.WriteLine("Target framework: NET471");
#elif NET472
        Console.WriteLine("Target framework: NET472");
#elif NETSTANDARD1_0
        Console.WriteLine("Target framework: NETSTANDARD1_0");
#elif NETSTANDARD1_1
        Console.WriteLine("Target framework: NETSTANDARD1_1");
#elif NETSTANDARD1_2
        Console.WriteLine("Target framework: NETSTANDARD1_2");
#elif NETSTANDARD1_3
        Console.WriteLine("Target framework: NETSTANDARD1_3");
#elif NETSTANDARD1_4
        Console.WriteLine("Target framework: NETSTANDARD1_4");
#elif NETSTANDARD1_5
        Console.WriteLine("Target framework: NETSTANDARD1_5");
#elif NETSTANDARD1_6
        Console.WriteLine("Target framework: NETSTANDARD1_6");
#elif NETSTANDARD2_0
        Console.WriteLine("Target framework: NETSTANDARD2_0");
#elif NETCOREAPP1_0
        Console.WriteLine("Target framework: NETCOREAPP1_0");
#elif NETCOREAPP1_1
        Console.WriteLine("Target framework: NETCOREAPP1_1");
#elif NETCOREAPP2_0
        Console.WriteLine("Target framework: NETCOREAPP2_0");
#elif NETCOREAPP2_1
        Console.WriteLine("Target framework: NETCOREAPP2_1");
#elif NETCOREAPP2_2
        Console.WriteLine("Target framework: NETCOREAPP2_2");
#else
        Console.WriteLine("Could not tell which framework we're using.");
#endif

结果输出是“无法判断我们正在使用哪个框架”。

我做错了吗?文档不正确吗?还是我发现了一个错误?

【问题讨论】:

请您提供一个示例项目文件吗?这将影响定义的符号。 如何编译代码?您使用 Visual Studio (MSBuild),还是从命令行运行 csc.exe (我刚刚使用<TargetFramework>net451</TargetFramework> 从一个全新的.NET Core 风格的SDK 项目中尝试过这个,结果很好。 不确定您是否这样做,但您是否注意您链接到的“目标框架”参考中标题为“如何指定目标框架”的部分? @CodeCaster,我正在使用 Visual Studio 2017, 15.9.6。 【参考方案1】:

这些指令仅由 .NET Core 的构建系统隐式生成。关键字from the documentation:

.NET Core 目标框架的预处理器符号的完整列表是:

因此,当您创建面向 .NET Framework 的新应用程序或类库时,这些指令将丢失。而是创建一个 Core 或 .NET Standard 库或应用程序。

如果您还没有准备好迁移到 Core,请参阅 Detect target framework version at compile time 了解解决方法 - 例如,您可以自己定义它们。

【讨论】:

就我而言,它是一个 WPF 应用程序,所以我还不能使用 .Net 核心或标准项目格式。谢谢! 当前的#if documentation 非常清楚地表明符号也将为各种框架版本预定义,但我想这是不正确的:[ 这个issue report 表明这是一个文档错误,很快就会修复 @dlf,您可以获得符号以用于 .Net Framework 项目,但您必须使用新的 .NetStandard 项目格式,并针对您首选的 .NetFramework 版本。他们甚至在文档页面上有一个示例。 我刚刚打开了一个针对 .NET Framework 4 的项目,NET40 的定义非常明确,因为我的#if NET40 工作正常,当我将目标框架更改为 .NET Framework 4.7.2 时,#if NET472不管用。我不认为 N​​ET40 与 .NET Core 有任何关系,否则为什么会在针对 .NET Framework 4 时定义那个?

以上是关于目标框架符号未定义的主要内容,如果未能解决你的问题,请参考以下文章

基础框架中单个方法的符号可以未定义吗?

静态 Swift 框架未能通过 CocoaPods 验证,并显示“未定义的架构符号”

在Xcode 4.5中使用ZXing库时,体系结构armv7的未定义符号

XCode7 UITesting - 如何添加从 UITestCase 可用的主要目标类(未定义符号错误)?

使用 Objective-C 框架构建 Swift 项目时出现“架构 arm64 的未定义符号”错误

奇怪的 Swift XCode '未定义符号' 错误