Skip to content

[msbuild][mac][ios] Fix referencing netstandard projects - #2643

Merged
chamons merged 1 commit into
dotnet:masterfrom
radical:xi-xm-fix-ns20-ref-master
Sep 13, 2017
Merged

[msbuild][mac][ios] Fix referencing netstandard projects#2643
chamons merged 1 commit into
dotnet:masterfrom
radical:xi-xm-fix-ns20-ref-master

Conversation

@radical

@radical radical commented Sep 11, 2017

Copy link
Copy Markdown
Member

Building a XI or XM (Modern) project that references a netstandard 2.0
project with msbuild fails because of a missing reference to
netstandard.dll.

AppDelegate.cs(21,52): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

The reason is that XI and XM (Modern) projects have
$(TargetFrameworkIdentifier) != .NETFramework, so targets from
Microsoft.NET.Build.Extensions which provide ns2.0 support don't get
imported. ImplicitlyExpandNETStandardFacades in particular, which
would have added a reference to netstandard.dll.

netstandard.dll gets included as part of the facades expanded by
ImplicitlyExpandDesignTimeFacades, but this gets skipped if the
project does not have a System.Runtime dependent reference.

Instead, we want to expand the facades if any reference depends on
System.Runtime OR netstandard. And for that we scan all the
references for a netstandard dependency using the
GetDependsOnNETStandard task.

Partially fixes bxc #58504 .

@radical radical changed the title [msbuild][mac][ios] Fix referencing netstandard projects [DONT_MERGE_YET][msbuild][mac][ios] Fix referencing netstandard projects Sep 11, 2017
@monojenkins

Copy link
Copy Markdown
Contributor

Build failure

Building a XI or XM (Modern) project that references a netstandard 2.0
project with msbuild fails because of a missing reference to
`netstandard.dll`.

AppDelegate.cs(21,52): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

The reason is that XI and XM (Modern) projects have
`$(TargetFrameworkIdentifier) != .NETFramework`, so targets from
`Microsoft.NET.Build.Extensions` which provide ns2.0 support don't get
imported. `ImplicitlyExpandNETStandardFacades` in particular, which
would have added a reference to `netstandard.dll`.

`netstandard.dll` gets included as part of the facades expanded by
`ImplicitlyExpandDesignTimeFacades`, but this gets skipped if the
project does not have a `System.Runtime` dependent reference.

Instead, we want to expand the facades if any reference depends on
`System.Runtime` OR `netstandard`. And for that we scan all the
references for a `netstandard` dependency using the
`GetDependsOnNETStandard` task.

Partially fixes bxc #58504 .
@radical
radical force-pushed the xi-xm-fix-ns20-ref-master branch from 2a7cc3b to cfe80b6 Compare September 11, 2017 18:17
@chamons

chamons commented Sep 11, 2017

Copy link
Copy Markdown
Contributor

Let me create a 2nd PR that has the test case to prevent blocking this PR.

@monojenkins

Copy link
Copy Markdown
Contributor

Build failure

@radical radical changed the title [DONT_MERGE_YET][msbuild][mac][ios] Fix referencing netstandard projects [msbuild][mac][ios] Fix referencing netstandard projects Sep 13, 2017
@chamons
chamons merged commit 5b8c685 into dotnet:master Sep 13, 2017
chamons pushed a commit to chamons/xamarin-macios that referenced this pull request Sep 13, 2017
Building a XI or XM (Modern) project that references a netstandard 2.0
project with msbuild fails because of a missing reference to
`netstandard.dll`.

AppDelegate.cs(21,52): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

The reason is that XI and XM (Modern) projects have
`$(TargetFrameworkIdentifier) != .NETFramework`, so targets from
`Microsoft.NET.Build.Extensions` which provide ns2.0 support don't get
imported. `ImplicitlyExpandNETStandardFacades` in particular, which
would have added a reference to `netstandard.dll`.

`netstandard.dll` gets included as part of the facades expanded by
`ImplicitlyExpandDesignTimeFacades`, but this gets skipped if the
project does not have a `System.Runtime` dependent reference.

Instead, we want to expand the facades if any reference depends on
`System.Runtime` OR `netstandard`. And for that we scan all the
references for a `netstandard` dependency using the
`GetDependsOnNETStandard` task.

Partially fixes bxc #58504 .
chamons added a commit that referenced this pull request Sep 21, 2017
…2731)

- https://bugzilla.xamarin.com/show_bug.cgi?id=59474
- The idea is to force Full and Modern to expand facades the same way. That way, we get the same, working behavior.
- f79f2e4 was not sufficient, even though it matched XI, because of the difference between XI (and Modern) and what Full was doing.
- Some context:

PR #2685

And that was problematic because it was expanding the netstandard facades from `Microsoft.NET.Build.Extensions`
in the `ImplicitlyExpandNETStandardFacades` target.
But we want to build against XM's bundled facades *only*. So we disable the ns facades completely
by setting `$(ImplicitlyExpandNETStandardFacades) = false`.

But now we are in the situation where a XM/Full project referencing a ns project might fail to build
because of a missing `netstandard.dll` reference! And this same case was fixed for XM/Modern projects in
#2643 . So, we enable the use of that for XM/Full projects too
through `Xamarin.Mac.msbuild.targets`.
chamons added a commit to chamons/xamarin-macios that referenced this pull request Sep 27, 2017
…otnet#2731)

- https://bugzilla.xamarin.com/show_bug.cgi?id=59474
- The idea is to force Full and Modern to expand facades the same way. That way, we get the same, working behavior.
- f79f2e4 was not sufficient, even though it matched XI, because of the difference between XI (and Modern) and what Full was doing.
- Some context:

PR dotnet#2685

And that was problematic because it was expanding the netstandard facades from `Microsoft.NET.Build.Extensions`
in the `ImplicitlyExpandNETStandardFacades` target.
But we want to build against XM's bundled facades *only*. So we disable the ns facades completely
by setting `$(ImplicitlyExpandNETStandardFacades) = false`.

But now we are in the situation where a XM/Full project referencing a ns project might fail to build
because of a missing `netstandard.dll` reference! And this same case was fixed for XM/Modern projects in
dotnet#2643 . So, we enable the use of that for XM/Full projects too
through `Xamarin.Mac.msbuild.targets`.
jonpryor pushed a commit to dotnet/android that referenced this pull request Feb 27, 2018
Context: #1154

This PR brings in changes from dotnet/macios#2643 and
dotnet/macios#2731 to improve our .NET Standard support.
While this does not fix the packaging problem in #1154 it will give
us parity with the iOS code base.
jonpryor pushed a commit to dotnet/android that referenced this pull request Feb 27, 2018
Context: #1154

This PR brings in changes from dotnet/macios#2643 and
dotnet/macios#2731 to improve our .NET Standard support.
While this does not fix the packaging problem in #1154 it will give
us parity with the iOS code base.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants