6

I have a .NET Core Console application. My goal here is to be able to conditionally DLLImport a function and call it, but only on Windows runtimes.

I thought maybe if I could access the runtime identifier in the csproj file, I could conditionally define a constant for that runtime, then in my c# I could surround the DLLImport and calls in #if/#endif blocks.

Is it possible to set compilation constants within a csproj based on the runtime the project is being built for? This is specifically for an SDK-style Project format (that starts with <Project Sdk="Microsoft.NET.Sdk">) that is targeting .NET Core.

Note: this question gets close, but is for project.json style projects.

Alternately, is there a better approach to accomplish my goal?

ahsteele
  • 25,470
  • 26
  • 131
  • 238
mrdrbob
  • 674
  • 1
  • 7
  • 14
  • you can define compiler constants in .csproj depending on some conditions. For example: TRACE;DEBUG;ABC;NETCOREAPP2_0 This xml node is located directly in the root "Project"-node. – gofal3 May 04 '18 at 05:57

1 Answers1

10

If you are building and publishing for different runtimes by passing different --runtime options (MSBuild property RuntimeIdentifier), you can condition on that property in the csproj file (allowing you to use #if BUILT_FOR_WINDOWS in your C# code):

<PropertyGroup>
  <DefineConstants Condition="'$(RuntimeIdentifier)' == 'win-x64'">$(DefineConstants);BUILT_FOR_WINDOWS</DefineConstants>
</PropertyGroup>

However you can also test the current OS at run time using:

using System.Runtime.InteropServices;
…

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    // call windows function here
}
else
{
    // do something else here
}

As long as a function marked with [DllImport(…)] is not called on an OS where the library / method cannot be found, there shouldn't be any problems. Do note that DllImport() can also probe for different libraries depending on the os - so DllImport("foo") would check for foo.dll, foo.dylib, libfoo.so etc.

Martin Ullrich
  • 78,211
  • 20
  • 211
  • 189