当目标为NET 4.6.1并使用Worker或Web角色并包含诸如ProjectReference Include
之类的软件包时,System.Runtime.CompilerServices.Unsafe
(当前在VS 2019和VS 2017)上似乎存在问题。结果是无法加载某些类型的运行时故障,例如,如果相关的库/ Nuget程序包或代码直接使用它或使用诸如ReadOnlySpan
之类的函数,则无法加载诸如AsSpan
的运行时失败。
进入Nuget软件包并将ref
软件包替换为lib
软件包可以解决此问题。我迅速尝试了https://github.com/xamarin/xamarin-android/issues/1162#issuecomment-359475008提出的目标修复程序,但是没有用。 MSBuild报告
项目中不存在AfterTargets属性中“ \ ReplaceRefAssemblies.targets(2,39)”处列出的目标“ _ResolveAssemblies”,因此将其忽略。
似乎向我表明AfterTargets
中特定的_ResolveAssemblies
不存在。尝试浏览MSBuild Structured Log Viewer
时,我也找不到合适的替代方法。所以有一个问题,我可以在哪里强制引用程序集到它们的实际lib对应项?或者,还有另一种方法可以解决该问题(通常是这样?
https://github.com/Microsoft/msbuild/issues/2776#issuecomment-487363546上有一个关于GH的公开问题,我还写下了观察结果。
<Project>
<Target Name="ReplaceRefAssemblies" AfterTargets="_ResolveAssemblies">
<ItemGroup>
<ResolvedAssembliesFixedWindows Include="@(ResolvedAssemblies->Replace('\ref\','\lib\'))" />
<ResolvedAssembliesFixedUnix Include="@(ResolvedAssemblies->Replace('/ref/','/lib/'))" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedWindows)" Condition="@(ResolvedAssembliesFixedWindows) != @(ResolvedAssemblies)" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedUnix)" Condition="@(ResolvedAssembliesFixedUnix) != @(ResolvedAssemblies)" />
<ResolvedAssemblies Condition="'@(ResolvedAssembliesFixed->Count())' > 0" Remove="@(ResolvedAssemblies)" />
<ResolvedAssemblies Include="@(ResolvedAssembliesFixed)" />
</ItemGroup>
</Target>
</Project>
和 其中第一个给出 CSC错误CS0006:元数据文件'C:\ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ system.text.encoding.codepages \ 4.3.0 \ lib \ netstandard1.3 \ System.Text.Encoding.CodePages.dll'找不到[C:some.csproj] 显然是因为在这种特定情况下,<Project>
<Target Name="ReplaceRefAssemblies" AfterTargets="ResolveAssemblyReferences">
<ItemGroup>
<ResolvedAssembliesFixedWindows Include="@(ReferencePath->Replace('\ref\','\lib\'))" />
<ResolvedAssembliesFixedUnix Include="@(ReferencePath->Replace('/ref/','/lib/'))" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedWindows)" Condition="@(ResolvedAssembliesFixedWindows) != @(ReferencePath)" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedUnix)" Condition="@(ResolvedAssembliesFixedUnix) != @(ReferencePath)" />
<ResolvedAssemblies Condition="'@(ResolvedAssembliesFixed->Count())' > 0" Remove="@(ReferencePath)" />
<ReferencePath Include="@(ResolvedAssembliesFixed)" />
</ItemGroup>
</Target>
</Project>
<Project>
<Target Name="ReplaceRefAssemblies" AfterTargets="ResolveAssemblyReferences">
<ItemGroup>
<ResolvedAssembliesFixedWindows Include="@(_ResolveAssemblyReferenceResolvedFiles->Replace('\ref\','\lib\'))" />
<ResolvedAssembliesFixedUnix Include="@(_ResolveAssemblyReferenceResolvedFiles->Replace('/ref/','/lib/'))" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedWindows)" Condition="@(ResolvedAssembliesFixedWindows) != @(_ResolveAssemblyReferenceResolvedFiles)" />
<ResolvedAssembliesFixed Include="@(ResolvedAssembliesFixedUnix)" Condition="@(ResolvedAssembliesFixedUnix) != @(_ResolveAssemblyReferenceResolvedFiles)" />
<ResolvedAssemblies Condition="'@(ResolvedAssembliesFixed->Count())' > 0" Remove="@(_ResolveAssemblyReferenceResolvedFiles)" />
<_ResolveAssemblyReferenceResolvedFiles Include="@(ResolvedAssembliesFixed)" />
</ItemGroup>
</Target>
</Project>
ref
文件夹与lib
不是“对称”的,因此普通路径替换无效。因此,应该有另一种方法,也许是逐一列出更改的路径,或者如果没有关系(例如程序正常运行),则有排除列表。