gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:45:46 33 4
gpt4 key购买 nike

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

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

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

$(Platform) 似乎不起作用。我可以使用其他变量吗?

最佳答案

为了区分 Windows 和 Mac/Linux,您可以使用 $(os) 属性:这为您提供了适用于 Windows 和 UNIXWindows_NT适用于 Mac/Linux。

要区分 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' and !$([System.IO.File]::Exists('/usr/lib/libc.dylib') ) "

对于 Mac -> Condition="'$(OS)' == 'Unix' and $([System.IO.File]::Exists('/usr/lib/libc.dylib')) "

来源:

关于c# - csproj 根据操作系统复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412140/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com