c# - 我可以根据 .NET Core 中的运行时标识符定义常量吗?
问题描述
我有一个 .NET Core 控制台应用程序。我的目标是能够有条件地DLLImport
调用一个函数并调用它,但仅限于 Windows 运行时。
我想也许如果我可以访问csproj
文件中的运行时标识符,我可以有条件地为该运行时定义一个常量,然后在我的 c# 中我可以包围 DLLImport 并调用#if
/#endif
块。
csproj
是否可以根据构建项目的运行时在 a 中设置编译常量?这专门针对面向 .NET Core 的 SDK 样式的项目格式(以 开头<Project Sdk="Microsoft.NET.Sdk">
)。
注意:这个问题很接近,但适用于project.json
风格项目。
或者,是否有更好的方法来实现我的目标?
解决方案
如果您通过传递不同的--runtime
选项(MSBuild 属性RuntimeIdentifier
)为不同的运行时构建和发布,您可以在 csproj 文件中以该属性为条件(允许您#if BUILT_FOR_WINDOWS
在 C# 代码中使用):
<PropertyGroup>
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'win-x64'">$(DefineConstants);BUILT_FOR_WINDOWS</DefineConstants>
</PropertyGroup>
但是,您也可以使用以下方法在运行时测试当前操作系统:
using System.Runtime.InteropServices;
…
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// call windows function here
}
else
{
// do something else here
}
只要[DllImport(…)]
没有在找不到库/方法的操作系统上调用标记为的函数,就不会有任何问题。请注意,DllImport()
它还可以根据操作系统探测不同的库 - 所以DllImport("foo")
会检查foo.dll
,foo.dylib
等libfoo.so
。
推荐阅读
- javascript - How do I fix my canvas width and height changing every render when I zoom in or out?
- php - php pear e-mail with bcc
- c++ - sizeof 子类如何在父模板类中使用,子类作为模板参数?
- javascript - 从输入和执行函数django中获取值
- sql - 如何在select语句中调用函数并计算总数?
- excel - 运行时错误 '9' - 试图引用现有工作表中的单元格
- reactjs - 如果 ReactJS 中的 prop 更改,则标记源不会更新
- javascript - 如何从与 Javascript Traverson HAL 的链接中获取 JSON 对象
- google-cloud-vertex-ai - 如何删除在 Google Vertex AI 中创建的元存储
- java - @PostMapping 在 Postman 中工作但不在浏览器中