如何替换/替代程序集路径MSBuild在生成过程中解决了问题(诱饵和切换失败)?

时间:2019-04-29 14:20:25

标签: c# msbuild

当目标为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())' &gt; 0" Remove="@(ResolvedAssemblies)" />
      <ResolvedAssemblies Include="@(ResolvedAssembliesFixed)" />
    </ItemGroup>
  </Target>
</Project>

ResolveAssemblyReference资源看起来是解决此问题的很好参考。

<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())' &gt; 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())' &gt; 0" Remove="@(_ResolveAssemblyReferenceResolvedFiles)" />      
      <_ResolveAssemblyReferenceResolvedFiles 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]

显然是因为在这种特定情况下,ref文件夹与lib不是“对称”的,因此普通路径替换无效。因此,应该有另一种方法,也许是逐一列出更改的路径,或者如果没有关系(例如程序正常运行),则有排除列表。

0 个答案:

没有答案