mrd*_*bob 4 c# interop .net-core runtime-identifier
我有一个.NET Core Console应用程序.我的目标是能够有条件地DLLImport调用一个函数并调用它,但仅限于Windows运行时.
我想也许如果我可以访问csproj文件中的运行时标识符,我可以有条件地为该运行时定义一个常量,然后在我的c#中我可以包围DLLImport并调用#if/ #endifblocks.
是否可以csproj根据构建项目的运行时间在一个内部设置编译常量?这是针对<Project Sdk="Microsoft.NET.Sdk">以.NET Core为目标的SDK风格的项目格式(以其开头).
注意:这个问题很接近,但适用于project.json样式项目.
或者,是否有更好的方法来实现我的目标?
如果您通过传递不同的--runtime选项(MSBuild属性RuntimeIdentifier)来构建和发布不同的运行时,则可以在csproj文件中对该属性进行条件限制(允许您#if BUILT_FOR_WINDOWS在C#代码中使用):
<PropertyGroup>
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'win-x64'">$(DefineConstants);BUILT_FOR_WINDOWS</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
但是,您还可以使用以下命令在运行时测试当前操作系统:
using System.Runtime.InteropServices;
…
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// call windows function here
}
else
{
// do something else here
}
Run Code Online (Sandbox Code Playgroud)
只要在[DllImport(…)]没有找到库/方法的操作系统上没有调用标记的函数,就不会有任何问题.难道注意,DllImport()还可以探测根据操作系统不同的库-这样DllImport("foo")会检查foo.dll,foo.dylib,libfoo.so等.
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |