gpt4 book ai didi

c# - 自定义 Is64BitOperatingSystem 预处理器指令

转载 作者:行者123 更新时间:2023-12-03 18:29:40 24 4
gpt4 key购买 nike

我们可以为 Platform Conditional Compilation in .NET Core 添加自定义预处理器指令像这样

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
<IsOSX Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'">true</IsOSX>
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
</PropertyGroup>
<PropertyGroup Condition="'$(IsWindows)'=='true'">
<DefineConstants>Windows</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(IsOSX)'=='true'">
<DefineConstants>OSX</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(IsLinux)'=='true'">
<DefineConstants>Linux</DefineConstants>
</PropertyGroup>
</Project>

我已经测试过了,它工作正常。

现在我想检测我是否在 64 位操作系统上。这是我的 .csproj

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Is64BitOperatingSystem Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'true'">true</Is64BitOperatingSystem>
</PropertyGroup>

<PropertyGroup Condition="'$(Is64BitOperatingSystem)'=='true'">
<DefineConstants>Is64BitOperatingSystem</DefineConstants>
</PropertyGroup>
</Project>

然而,当我运行这段代码时,我的第一个 if...else按预期工作但不是我的 Is64BitOperatingSystem预处理指令

if (System.Environment.Is64BitOperatingSystem)
Console.WriteLine(64);
else
Console.WriteLine(32);

#if Is64BitOperatingSystem
Console.WriteLine(64);
#else
Console.WriteLine(32);
#endif

我做错了什么?我无法找出代码中的错误所在。

谢谢

编辑

为了添加更多相关细节,我将这段代码包含在 .NET Core 项目调用的 .NET Standard 库中。

我希望我的库检测它正在运行的当前架构(或已编译),这样我就可以做这样的事情

#if Is64BitOperatingSystem
[DllImport(@"Resources/HIDAPI/x64/hidapi")]
#else
[DllImport(@"Resources/HIDAPI/x32/hidapi")]
#endif

在调试之前,Visual Studio 显然会编译我的应用程序,因此在此阶段使用 System.Environment.Is64BitOperatingSystem 检查架构或者预处理器指令应该给出相同的结果,但事实并非如此。我在 64 位机器上,我的预处理器指令告诉我我在 32 位架构上,即使我更改了 AnyCPUx64在 Visual Studio 配置管理器中

请注意 this answer是 Windows 特定的并且 that one也是因为解决方案是调用 SetDllDirectory来自 kernel32.dll 的函数

但我希望我的代码能够在 Linux 上运行。

编辑 2:

为了在这里分享一个最小的示例,我实际上删除了我的代码中有错误的部分。

看起来这给出了预期的结果:

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Is64BitOperatingSystem Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'true'">true</Is64BitOperatingSystem>
</PropertyGroup>

<PropertyGroup Condition="'$(Is64BitOperatingSystem)'=='true'">
<DefineConstants>Is64BitOperatingSystem</DefineConstants>
</PropertyGroup>

但这给出了错误的行为:

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Is64BitOperatingSystem Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'true'">true</Is64BitOperatingSystem>
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
</PropertyGroup>

<PropertyGroup Condition="'$(Is64BitOperatingSystem)'=='true'">
<DefineConstants>Is64BitOperatingSystem</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition="'$(IsWindows)'=='true'">
<DefineConstants>Windows</DefineConstants>
</PropertyGroup>

谁能给我解释一下?我不明白为什么要添加 IsWindows条件是导致 Is64BitOperatingSystem 上的不同行为的原因预处理指令

最佳答案

它在上次编辑中不起作用的原因是 DefineConstants 中的条件常量不能单独定义,此属性的值是分号分隔的值列表,应由向现有列表添加一个新常量(非常感谢@Orace 的帮助)

<PropertyGroup Condition="'$(IsWindows)'=='true'">
<DefineConstants>$(DefineConstants);Windows</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition="'$(Is64BitOperatingSystem)'=='true'">
<DefineConstants>$(DefineConstants);Is64BitOperatingSystem</DefineConstants>
</PropertyGroup>

您也可以将这些值传递给 msbuild 命令行。

下面的代码将按预期工作

#if Windows
Console.WriteLine("built in Windows!");
#endif

#if Is64BitOperatingSystem
Console.WriteLine("built on x64");
#else
Console.WriteLine("built on x86");
#endif
Console.WriteLine(Environment.Is64BitOperatingSystem ? "running on x64" : "running on x86");

它将显示:

built in Windows! 
built on x64
running on x64

您也可以用同样的方式添加一个 Linux 常量。

以下 msbuild 目标将帮助您检查项目中定义了哪些常量

<Target BeforeTargets="Build" Name="test">
<Message Importance="High" Text="$(DefineConstants)"/>
</Target>

在我的测试应用程序中,它显示 TRACE;Windows;Is64BitOperatingSystem;DEBUG;NETCOREAPP;NETCOREAPP2_1

关于c# - 自定义 Is64BitOperatingSystem 预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com