I am using .NET Core to build a cross platform class library. Depending on the operating system that the C# .NET Core project is built for using a .csproj file, I need to copy a native library to the project's output directory. E.g., for OS X I want to copy a .dylib file, for Windows I want to copy a .DLL file, for Linux I want to copy a .so file.
How can I do this with a Condition clause in a .csproj ItemGroup?
<ItemGroup>
<Content Include="libNative.dylib" Condition=" '$(Configuration)|$(Platform)' == 'Debug|OSX' ">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
$(Platform)
does not seem to work. Is there a different variable I can use?
As a follow-up to @tzachs accepted answer, since msbuild 15.3 (basically Visual Studio 2017+ or .NET Core 2+) you can shorten this to use the [MSBuild]::IsOSPlatform()
method. (Documentation on this page.)
It accepts values of the OSPlatform struct, e.g. Windows
, Linux
, OSX
, FreeBSD
.
<ItemGroup>
<Content Include="libNative.dll" Condition="$([MSBuild]::IsOSPlatform('Windows'))">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libNative.so" Condition="$([MSBuild]::IsOSPlatform('Linux'))">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libNative.dylib" Condition="$([MSBuild]::IsOSPlatform('OSX'))">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>