Search code examples
c#.net.net-corecsproj

csproj copy files depending on operating system


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?


Solution

  • 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>