【发布时间】:2020-06-01 11:40:34
【问题描述】:
在尝试设置一些代码覆盖工具并通过 Mac 上的 VisualStudio 处理新的 Xamarin.Forms 项目时,我尝试按照mac/linux `dotnet build` The reference assemblies for framework ".NETFramework.." were not found 中的建议使用netfx.props。 (我会直接针对这个问题发表评论,但可惜我没有足够的声望点。)
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -->
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- When compiling .NET SDK 2.0 projects targeting .NET 4.x on Mono using 'dotnet build' you -->
<!-- have to teach MSBuild where the Mono copy of the reference asssemblies is -->
<TargetIsMono Condition="($(TargetFramework.StartsWith('net4')) OR $(TargetFrameworkVersion.StartsWith('v4.'))) AND '$(OS)' == 'Unix'">true</TargetIsMono>
<!-- Look in the standard install locations -->
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/Library/Frameworks/Mono.framework/Versions/Current/lib/mono')">/Library/Frameworks/Mono.framework/Versions/Current/lib/mono</BaseFrameworkPathOverrideForMono>
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/lib/mono')">/usr/lib/mono</BaseFrameworkPathOverrideForMono>
<BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/local/lib/mono')">/usr/local/lib/mono</BaseFrameworkPathOverrideForMono>
<!-- If we found Mono reference assemblies, then use them -->
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net45' OR '$(TargetFrameworkVersion)' == 'v4.5')">$(BaseFrameworkPathOverrideForMono)/4.5-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net451' OR '$(TargetFrameworkVersion)' == 'v4.5.1')">$(BaseFrameworkPathOverrideForMono)/4.5.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net452' OR '$(TargetFrameworkVersion)' == 'v4.5.2')">$(BaseFrameworkPathOverrideForMono)/4.5.2-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net46' OR '$(TargetFrameworkVersion)' == 'v4.6')">$(BaseFrameworkPathOverrideForMono)/4.6-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net461' OR '$(TargetFrameworkVersion)' == 'v4.6.1')">$(BaseFrameworkPathOverrideForMono)/4.6.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net462' OR '$(TargetFrameworkVersion)' == 'v4.6.2')">$(BaseFrameworkPathOverrideForMono)/4.6.2-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net47' OR '$(TargetFrameworkVersion)' == 'v4.7')">$(BaseFrameworkPathOverrideForMono)/4.7-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net471' OR '$(TargetFrameworkVersion)' == 'v4.7.1')">$(BaseFrameworkPathOverrideForMono)/4.7.1-api</FrameworkPathOverride>
<FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND ('$(TargetFramework)' == 'net472' OR '$(TargetFrameworkVersion)' == 'v4.7.2')">$(BaseFrameworkPathOverrideForMono)/4.7.2-api</FrameworkPathOverride>
<EnableFrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">true</EnableFrameworkPathOverride>
<!-- Add the Facades directory. Not sure how else to do this. Necessary at least for .NET 4.5 -->
<AssemblySearchPaths Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">$(FrameworkPathOverride)/Facades;$(AssemblySearchPaths)</AssemblySearchPaths>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'== 'net472' OR '$(TargetFrameworkVersion)' == 'v4.7.2'">
<Reference Include="netstandard" />
</ItemGroup>
</Project>
文件是通过 .csproj 导入的,但它仍然无法正常工作,所以我使用以下命令打印了一些调试消息:
<Target Name="test">
<Message Importance="High" Text="TargetFramework value is '$(TargetFramework)', starts with net4 is '$(TargetFramework.StartsWith('net4'))'" />
<Message Importance="High" Text="TargetFrameworkVersion value is '$(TargetFrameworkVersion)', starts with v4 is '$(TargetFrameworkVersion.StartsWith('v4'))'" />
<Message Importance="High" Text="OS value is '$(OS)'" />
<Message Importance="High" Text="TargetIsMono value is '$(TargetIsMono)'" />
<Message Importance="High" Text="BaseFrameworkPathOverrideForMono value is '$(BaseFrameworkPathOverrideForMono)'" />
<Message Importance="High" Text="FrameworkPathOverride value is '$(FrameworkPathOverride)'" />
<Message Importance="High" Text="EnableFrameworkPathOverride value is '$(EnableFrameworkPathOverride)'" />
</Target>
看到了:
TargetFramework value is '', starts with net4 is 'False'
TargetFrameworkVersion value is 'v4.7', starts with v4 is 'True'
OS value is 'Unix'
TargetIsMono value is ''
BaseFrameworkPathOverrideForMono value is ''
FrameworkPathOverride value is '/Library/Frameworks/Mono.framework/Versions/6.6.0/lib/mono/4.7-api'
EnableFrameworkPathOverride value is ''
TargetIsMono 仍然为空,即使由于TargetFrameworkVersion.StartsWith 和OS 而应该设置为“true”。在使用TargetIsMono Condition 之后,问题似乎是即使StartsWiths 根据打印消息具有正确的布尔值,它们实际上并没有在Condition 中正确评估。
即,
<TargetIsMono Condition="$(TargetFrameworkVersion.StartsWith('v4.'))>true</TargetIsMono>
不会将TargetIsMono 设置为'true',即使它应该设置。
有人有什么想法吗?我是 MsBuild、Xamarin.Forms 和 VisualStudio 的新手。任何帮助将不胜感激!
【问题讨论】:
标签: c# xamarin.forms msbuild visual-studio-mac .net-framework-version