微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – csproj根据操作系统复制文件

我正在使用.NET Core构建跨平台类库.根据为使用.csproj文件构建C#.NET Core项目的操作系统,我需要将本机库复制到项目的输出目录.例如,对于OS X我想复制.dylib文件,对于 Windows我要复制.DLL文件,对于 Linux我要复制.so文件.

如何使用.csproj ItemGroup中的Condition子句执行此操作?

<ItemGroup>
    <Content Include="libNative.dylib" Condition=" '$(Configuration)|$(Platform)' == 'Debug|OSX' ">
      <copyToOutputDirectory>PreserveNewest</copyToOutputDirectory>
    </Content>
  </ItemGroup>

$(平台)似乎不起作用.我可以使用不同的变量吗?

解决方法

用于区分Windows和Windows Mac / Linux你可以使用$(os)属性:这为你提供了适用于Windows的Windows_NT和适用于Mac / Linux的UNIX.

为了区分Mac和& Linux,至少在最新版本的MSBuild上,你可以使用Runtimeinformation.IsOSPlatform.

所以,结合起来,你的csproj可以有这样的东西:

<ItemGroup>
    <Content Include="libNative.dll" Condition=" '$(OS)' == 'Windows_NT' ">
      <copyToOutputDirectory>PreserveNewest</copyToOutputDirectory>
    </Content>
    <Content Include="libNative.so" Condition=" '$([System.Runtime.InteropServices.Runtimeinformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' ">
      <copyToOutputDirectory>PreserveNewest</copyToOutputDirectory>
    </Content>
    <Content Include="libNative.dylib" Condition=" '$([System.Runtime.InteropServices.Runtimeinformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' ">
      <copyToOutputDirectory>PreserveNewest</copyToOutputDirectory>
    </Content>
</ItemGroup>

据我所知,这应该适用于.Net Core,Mono和.Net Framework的所有最新版本.

在旧版本中,您需要诉诸恶意技巧来区分Mac& Linux的:

对于Linux – > Condition =“’$(OS)’==’Unix’和!$([System.IO.File] :: Exists(‘/usr/lib / libc.dylib’))”

对于Mac – > Condition =“’$(OS)’==’Unix’和$([System.IO.File] :: Exists(‘/usr/lib / libc.dylib’))”

资料来源:

> https://github.com/Microsoft/msbuild/issues/539
> https://github.com/Microsoft/msbuild/issues/2468

原文地址:https://www.jb51.cc/csharp/244172.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐