我有一个.NETStandard 2.0类库,它是通过Nuget分发的。它包括特定于我们的目标平台的已编译的本机代码库。 .csproj
看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>CoolProject</PackageId>
<Version>0.8.1</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AnotherCoolProject" Version="0.3.2" />
<PackageReference Include="YetAnotherCoolProject" Version="7.4.2" />
</ItemGroup>
<ItemGroup>
<None Pack="true" PackagePath="runtimes/win-x86/native/library32.dll" Update="library32.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Pack="true" PackagePath="runtimes/win-x64/native/library64.dll" Update="library64.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Pack="true" PackagePath="runtimes/linux-x64/native/liblibrary.so" Update="liblibrary.so">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
这适用于所有支持平台上的.NET Core应用程序。但是,最近,我们发现了.NET Framework应用程序中使用此库的问题 - 运行时库并不总是复制到引用项目,导致System.IO.FileNotFoundException
异常。这似乎与此问题有关:
https://github.com/Microsoft/msbuild/issues/1582
作为一种解决方法,我们希望向包中添加Framework 4.6.1目标。如果我只是更新上面的项目文件,删除TargetFramework
属性并添加
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
项目构建没有错误,并且net461
下的netstandard2.0
和lib/
文件夹创建了nupkg,但不再包含任何运行时文件。我可以通过解压缩.nupkg来验证这一点,但是随着包大小从大约2mb变为大约20kb,它非常明显。我已尝试在ItemGroup
中添加条件
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
但仍然没有。我在这里缺少什么?