【发布时间】:2023-06-20 20:03:01
【问题描述】:
我正在使用 .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>
$(Platform) 似乎不起作用。我可以使用其他变量吗?
【问题讨论】:
-
$(Platform) 具有不同的值,例如 Any CPU、x86、x64。我会检查它是如何为具有特定于平台的依赖项的开源库完成的。据我所知,有些人通过单独的 nuget 包提供此类特定于平台的依赖项。就像他们在nuget.org/packages/CoreCompat.System.Drawing/1.0.0-beta006中所做的一样@
-
当您针对 OSX 构建时,$(Platform) 变量的值是多少?
-
Platform=AnyCPU但对于 Windows 和 Linux 版本也是如此。 -
最“干净”的方法是制作一个 NuGet 包,其中包含不同运行时文件夹中的所有本机库资产。当您引用这样的 NuGet 时,您将免费获得自动查找。集成到构建中时,需要构建 3 次,每个平台一次。这对于独立的应用程序来说是可以的,但对于便携式应用程序来说却不是。
-
@MartinUllrich 是否有一些示例项目可以说明如何做到这一点?