Bug 58554 - CS0103 build error after changing the BaseIntermediateOutputPath for a .Net Standard library that references X.Forms
Summary: CS0103 build error after changing the BaseIntermediateOutputPath for a .Net S...
Status: CONFIRMED
Alias: None
Product: Forms
Classification: Xamarin
Component: Forms ()
Version: 2.3.5
Hardware: PC Windows
: --- normal
Target Milestone: ---
Assignee: Ankit Jain
URL:
Depends on:
Blocks:
 
Reported: 2017-08-02 19:26 UTC by Jon Goldberger [MSFT]
Modified: 2017-08-05 11:53 UTC (History)
3 users (show)

Tags:
Is this bug a regression?: ---
Last known good build:


Attachments
NetStandardXamFormsTestProject (5.13 KB, application/zip)
2017-08-03 09:33 UTC, Matt Ward
Details


Notice (2018-05-24): bugzilla.xamarin.com is now in read-only mode.

Please join us on Visual Studio Developer Community and in the Xamarin and Mono organizations on GitHub to continue tracking issues. Bugzilla will remain available for reference in read-only mode. We will continue to work on open Bugzilla bugs, copy them to the new locations as needed for follow-up, and add the new items under Related Links.

Our sincere thanks to everyone who has contributed on this bug tracker over the years. Thanks also for your understanding as we make these adjustments and improvements for the future.


Please create a new report for Bug 58554 on Developer Community or GitHub if you have new information to add and do not yet see a matching new report.

If the latest results still closely match this report, you can use the original description:

  • Export the original title and description: Developer Community HTML or GitHub Markdown
  • Copy the title and description into the new report. Adjust them to be up-to-date if needed.
  • Add your new information.

In special cases on GitHub you might also want the comments: GitHub Markdown with public comments

Related Links:
Status:
CONFIRMED

Description Jon Goldberger [MSFT] 2017-08-02 19:26:28 UTC
## description

Changing the BaseIntermediateOutputPath property of a .Net Standard library that references Xamarin Forms, and has a Content Page template page in the project, to anything other than obj/ causes a cs0103 error oin build:

In a .Net Standard library that references Xamarin Forms and has a template ContentPage, changing the BaseIntermediateOutputPath property to anything other than obj/ causes a cs0103 error on build:

>/path/to/file/Page1.xaml.cs(4,4): Error CS0103: The name 'InitializeComponent' does not exist in the current context (CS0103) (TestFormsBIOP)


This occurs in either VS (Windows) or in VS (Mac). I saw this similar bug report, bug 55593, but that was noted to be fixed in the current stable version 15.2


## Steps to reproduce (Windows):

1. Open Visual Studio 2017 (Windows) and create a new .Net Standard Library

2. Add a reference to Xamarin Forms to the .Net Standard library

3. Add a Forms Content Page to the project

4. Build the project and it will succeed

5. Edit the .csproj file, adding the following to the <PropertyGroup>, e.g.:

> <PropertyGroup>
>    <TargetFramework>netstandard1.4</TargetFramework>
>    <BaseIntermediateOutputPath>hello/</BaseIntermediateOutputPath>
> </PropertyGroup>

6. Clean and rebuild the project.

Expected result: Project will build successfully.

Actual Result: Project fails to build with above error.


## Notea

Once the BaseIntermediateOutputPath is changed to "hello/", you see a "hello" and a "bin" folder in the project directory as expected, so it appears the changed value is being respected. 


## Environment

Windows:

Microsoft Visual Studio Enterprise 2017 
Version 15.2 (26430.15) Release
VisualStudio.15.Release/15.2.0+26430.15
Microsoft .NET Framework
Version 4.7.02046

Installed Version: Enterprise

Architecture Diagrams and Analysis Tools   00369-60000-00001-AA405
Microsoft Architecture Diagrams and Analysis Tools

Visual Basic 2017   00369-60000-00001-AA405
Microsoft Visual Basic 2017

Visual C# 2017   00369-60000-00001-AA405
Microsoft Visual C# 2017

Visual C++ 2017   00369-60000-00001-AA405
Microsoft Visual C++ 2017

Visual F# 4.1   00369-60000-00001-AA405
Microsoft Visual F# 4.1

Application Insights Tools for Visual Studio Package   8.6.00404.2
Application Insights Tools for Visual Studio

ASP.NET and Web Tools 2017   15.0.30503.0
ASP.NET and Web Tools 2017

ASP.NET Web Frameworks and Tools 2012   4.0.11203.0
For additional information, visit https://www.asp.net/

ASP.NET Web Frameworks and Tools 2017   5.2.50303.0
For additional information, visit https://www.asp.net/

Azure App Service Tools v3.0.0   15.0.30209.0
Azure App Service Tools v3.0.0

Azure Data Lake Node   1.0
This package contains the Data Lake integration nodes for Server Explorer.

Azure Data Lake Tools for Visual Studio   2.2.5000.0
Microsoft Azure Data Lake Tools for Visual Studio

Common Azure Tools   1.9
Provides common services for use by Azure Mobile Services and Microsoft Azure Tools.

Fabric.DiagnosticEvents   1.0
Fabric Diagnostic Events

JavaScript Language Service   2.0
JavaScript Language Service

JavaScript Project System   2.0
JavaScript Project System

JavaScript UWP Project System   2.0
JavaScript UWP Project System

KofePackagePackage Extension   1.0
KofePackagePackage Visual Studio Extension Detailed Info

Merq   1.1.17-rc (cba4571)
Command Bus, Event Stream and Async Manager for Visual Studio extensions.

Microsoft Azure Hive Query Language Service   2.2.5000.0
Language service for Hive query

Microsoft Azure Tools   2.9
Microsoft Azure Tools for Microsoft Visual Studio 2017 - v2.9.50131.1

Microsoft MI-Based Debugger   1.0
Provides support for connecting Visual Studio to MI compatible debuggers

Microsoft Visual Studio VC Package   1.0
Microsoft Visual Studio VC Package

Mono Debugging for Visual Studio   Mono.Debugging.VisualStudio
Support for debugging Mono processes with Visual Studio.

NuGet Package Manager   4.2.0
NuGet Package Manager in Visual Studio. For more information about NuGet, visit http://docs.nuget.org/.

SQL Server Data Tools   15.1.61702.140
Microsoft SQL Server Data Tools

ToolWindowHostedEditor   1.0
Hosting json editor into a tool window

TypeScript   2.2.2.0
TypeScript tools for Visual Studio

Visual C++ for Cross Platform Mobile Development (Android)   15.0.26228.00
Visual C++ for Cross Platform Mobile Development (Android)

Visual C++ for Cross Platform Mobile Development (iOS)   15.0.26228.00
Visual C++ for Cross Platform Mobile Development (iOS)

Visual Studio Tools for Universal Windows Apps   15.0.26430.06
The Visual Studio Tools for Universal Windows apps allow you to build a single universal app experience that can reach every device running Windows 10: phone, tablet, PC, and more. It includes the Microsoft Windows 10 Software Development Kit.

Xamarin   4.5.0.486 (fec6f88)
Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android.

Xamarin.Android SDK   7.3.1.2 (9dbc4c5)
Xamarin.Android Reference Assemblies and MSBuild support.

Xamarin.iOS and Xamarin.Mac SDK   10.10.0.37 (ad35de4)
Xamarin.iOS and Xamarin.Mac Reference Assemblies and MSBuild support.



Mac:

=== Visual Studio Enterprise 2017 for Mac ===

Version 7.0.1 (build 24)
Installation UUID: f86726f2-bd5d-4610-867e-44e82f306ca2
Runtime:
	Mono 5.0.1.1 (2017-02/5077205) (64-bit)
	GTK+ 2.24.23 (Raleigh theme)

	Package version: 500010001

=== NuGet ===

Version: 4.0.0.2323

=== .NET Core ===

Runtime: /usr/local/share/dotnet/dotnet
SDK: /usr/local/share/dotnet/sdk/1.0.1/Sdks
MSBuild SDKs: /Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/msbuild/15.0/bin/Sdks

=== Xamarin.Profiler ===

Version: 1.5.4
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Apple Developer Tools ===

Xcode 8.3.3 (12175.1)
Build 8E3004b

=== Xamarin.Android ===

Version: 7.3.1.2 (Visual Studio Enterprise)
Android SDK: /Users/jongoldberger/Library/Developer/Xamarin/android-sdk-macosx
	Supported Android versions:
		4.0.3 (API level 15)
		4.1   (API level 16)
		4.2   (API level 17)
		4.3   (API level 18)
		4.4   (API level 19)
		5.0   (API level 21)
		5.1   (API level 22)
		6.0   (API level 23)
		7.0   (API level 24)
		7.1   (API level 25)

SDK Tools Version: 26.0.2
SDK Platform Tools Version: 25.0.5
SDK Build Tools Version: 26.0.0

Java SDK: /usr
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

=== Xamarin.iOS ===

Version: 10.10.0.36 (Visual Studio Enterprise)
Hash: d2270eec
Branch: d15-2
Build date: 2017-05-22 16:30:53-0400

=== Xamarin.Mac ===

Version: 3.4.0.36 (Visual Studio Enterprise)

=== Build Information ===

Release ID: 700010024
Git revision: 7ab1ca2ced6f584e56b7a0d4d321d00775cd95c9
Build date: 2017-05-19 05:44:51-04
Xamarin addins: 08d17158f3365beee5e60f67999e607cce4b3f93
Build lane: monodevelop-lion-d15-2

=== Operating System ===

Mac OS X 10.12.6
Darwin 16.7.0 Darwin Kernel Version 16.7.0
    Thu Jun 15 17:36:27 PDT 2017
    root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
Comment 1 Matt Ward 2017-08-03 09:33:39 UTC
Created attachment 23997 [details]
NetStandardXamFormsTestProject

Note that bug 55593 is unrelated to this particular bug. Bug 55593 was not a build error but an error shown in the text editor for the InitializeComponent method. The build worked there.

The problem seems to be that if the BaseIntermediatePath is set the generated .nuget.g.targets and .nuget.g.props files are not loaded so the XamlG task is never used. The generated .nuget.g.targets files are created in the BaseIntermediatePath directory.

If instead you only define the IntermediateOutputPath to be something different then the build works. 

<IntermediateOutputPath>hello\Debug</IntermediateOutputPath> 

What is interesting here is that whilst the above IntermediateOutputPath is used for the generated MyView.xaml.g.cs files, and compiled binaries, the generated .nuget.g.* files are created in the obj directory. So my guess is that this is a NuGet build task problem. If the .nuget.g.* files are not in the obj directory then things breaks - the Xamarin.Forms msbuild imports are not used since the .nuget.g.* files are not used. A workaround here for the BaseIntermediatePath is to copy the .nuget.g.* files into the obj directory. Then the build works.

Also tried using dotnet restore when the BaseIntermediatePath is configured and the .nuget.g.* files are generated in the new BaseIntermediatePath directory.

This does not seem to be IDE specific. Using msbuild from the command line gives the same build error.

Attached a sample project that reproduces the build error.

MSBuild diagnostic output: 

https://gist.github.com/mrward/a0c70538e1ad836a3460640dd03a3c06

MSBuild diagnostic output when IntermediateOutputPath is defined instead.

https://gist.github.com/mrward/643fd337c85e7e7c96558fe18e6671ce
Comment 2 Matt Ward 2017-08-03 10:42:32 UTC
Digging into this a bit more. The *.nuget.g.* files seem to be imported based on the MSBuildProjectExtensionsPath property. In both the MSBuild output in the previous comment this property is defined to be:

MSBuildProjectExtensionsPath = /Users/matt/Projects/Tests/NetStandardXamFormsTest/NetStandardXamFormsTest/obj/

This value seems to be defined by the Microsoft.Common.props:

/Library/Frameworks/Mono.framework/Versions/5.4.0/lib/mono/xbuild/15.0/Microsoft.Common.props

  <PropertyGroup>
    <!--
            The declaration of $(BaseIntermediateOutputPath) had to be moved up from Microsoft.Common.CurrentVersion.targets
            in order for the $(MSBuildProjectExtensionsPath) to use it as a default.
        -->
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">obj\</BaseIntermediateOutputPath>
    <BaseIntermediateOutputPath Condition="!HasTrailingSlash('$(BaseIntermediateOutputPath)')">$(BaseIntermediateOutputPath)\</BaseIntermediateOutputPath>
    <MSBuildProjectExtensionsPath Condition="'$(MSBuildProjectExtensionsPath)' == '' ">$(BaseIntermediateOutputPath)</MSBuildProjectExtensionsPath>
 
Then later on this file then imports all ProjectFileName.*.props files from this directory which import the nuget.g.props.

  <Import Project="$(MSBuildProjectExtensionsPath)$(MSBuildProjectFile).*.props" Condition="'$(ImportProjectExtensionProps)' == 'true' and exists('$(MSBuildProjectExtensionsPath)')" />

Presumably something similar happens for the nuget.g.targets files. I am assuming the importing of the .nuget.g.targets file is done via the .NET Core sdk's Microsoft.Common.targets since they seem to do that.

So I am guessing that the BaseIntermediateOutputPath is not defined when the MSBuildProjectExtensionsPath is set. Presumably based on when the imports are loaded. The only way I could get this to build on the command line with msbuild is to move the Sdk imports around so the BaseIntermediateOutputPath is defined before the first Sdk.props import:

<Project>
  <PropertyGroup>
    <BaseIntermediateOutputPath>hello/</BaseIntermediateOutputPath>
  </PropertyGroup>

  <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.props" />

  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
    <PackageTargetFallback>portable-net45+win8+wpa81+wp8</PackageTargetFallback>
    <BaseIntermediateOutputPath>hello/</BaseIntermediateOutputPath>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="2.3.4.247" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="MyView.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
  </ItemGroup>
  <ItemGroup>
    <Compile Update="MyView.xaml.cs">
      <DependentUpon>MyView.xaml</DependentUpon>
    </Compile>
  </ItemGroup>

  <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
</Project>

Unfortunately VS Mac does not support the above file format, which it probably should, however dotnet restore and msbuild work and are happy with it.
Comment 3 Matt Ward 2017-08-05 11:53:00 UTC
Looking into another bug I saw this GitHub issue which is basically the same bug we have here in bugzilla: 

https://github.com/Microsoft/msbuild/issues/1603

So another workaround here is to use a Directory.Build.props file in a folder above your projects, such as next to the solution. This seems to work with VS Mac 7.1 build 1294 with .NET Core 2.0 SDK installed. Not tested .NET Core 1.0.4 SDK installed on its own.