Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

netcoreapp3.0: Cannot run both Xamarin.Forms and Fody together in the same compilation unit #3508

Closed
jahmai-ca opened this issue Sep 30, 2019 · 10 comments · Fixed by Fody/Fody#755
Assignees

Comments

@jahmai-ca
Copy link

jahmai-ca commented Sep 30, 2019

netcoreapp3.0: Cannot run both Xamarin.Forms and Fody together in the same compilation unit

I don't know exactly where this issue resides, but it appears to be related to assembly resolution with netcore 3, since the issue doesn't happen with netcore 2.

Both Fody and Xamarin.Forms have a compilation step that uses Mono.Cecil. Currently the latest versions of both these packages use different versions of Mono.Cecil.

If you have a netstandard2.0 project with both Xamarin.Forms and Fody which is then referenced by a netcoreapp3.0 project (such as a unit test project), dotnet build fails with;

PS C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3.Test> dotnet build .\FodyDotNet3.Test.csproj                                                                                                                                 Microsoft (R) Build Engine version 16.3.0+0f4c62fea for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 121.61 ms for C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj.
  Restore completed in 388.22 ms for C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3.Test\FodyDotNet3.Test.csproj.
MSBUILD : error : Fody: An unhandled exception occurred: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Exception: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Could not load file or assembly 'Mono.Cecil, Version=0.11.0.0, Culture=neutral, PublicKeyToken=1ca091877d12ca03'. The system cannot find the file specified. [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Type: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : System.IO.FileNotFoundException [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : StackTrace: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.Execute() [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.ExecuteInOwnAssemblyLoadContext() in C:\projects\fody\Fody\Processor.cs:line 150 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.Inner() in C:\projects\fody\Fody\Processor.cs:line 122 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.Execute() in C:\projects\fody\Fody\Processor.cs:line 51 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Source: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : FodyIsolated [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : TargetSite: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Void Execute() [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :  [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]

Build FAILED.

MSBUILD : error : Fody: An unhandled exception occurred: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Exception: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Could not load file or assembly 'Mono.Cecil, Version=0.11.0.0, Culture=neutral, PublicKeyToken=1ca091877d12ca03'. The system cannot find the file specified. [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Type: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : System.IO.FileNotFoundException [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : StackTrace: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.Execute() [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.ExecuteInOwnAssemblyLoadContext() in C:\projects\fody\Fody\Processor.cs:line 150 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.Inner() in C:\projects\fody\Fody\Processor.cs:line 122 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at Processor.Execute() in C:\projects\fody\Fody\Processor.cs:line 51 [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Source: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : FodyIsolated [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : TargetSite: [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Void Execute() [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :  [C:\Users\JahmaiLay\source\repos\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:01.20

If you run it again, it will succeed. I suspect because one of the post-compile phases for Xamarin.Forms or Fody is done in the first run, and the other in the second.

General

VS 2019 16.3.1
.net core 3.0.100

See attached reproduction project. Just dotnet build the test project.

FodyDotNet3.zip

@jahmai-ca
Copy link
Author

jahmai-ca commented Sep 30, 2019

Note, when I say "it works with netcore 2", I mean downgrading the Test project to netcoreapp2.2 and put the attached global.json in the solution folder.

global.zip

(Only downgrading to netcoreapp2.2 in the project still uses dotnet 3.0.100 if you have it installed, which has the same issue)

@SimonCropp
Copy link

i cant reproduce this

it builds in both VS and dotnet cli

PS C:\Downloads\FodyDotNet3> dotnet build --force
Microsoft (R) Build Engine version 16.3.0+0f4c62fea for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 164.81 ms for C:\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj.
  Restore completed in 761.89 ms for C:\Downloads\FodyDotNet3\FodyDotNet3.Test\FodyDotNet3.Test.csproj.
  FodyDotNet3 -> C:\Downloads\FodyDotNet3\FodyDotNet3\bin\Debug\netstandard2.0\FodyDotNet3.dll
  FodyDotNet3.Test -> C:\Downloads\FodyDotNet3\FodyDotNet3.Test\bin\Debug\netcoreapp3.0\FodyDotNet3.Test.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.47

does it fail for you on a ci server (eg appveyor) or on a coworkers machine?

@jahmai-ca
Copy link
Author

jahmai-ca commented Sep 30, 2019 via email

@SimonCropp
Copy link

sorry yep can repro now.

can you try replacing

    <PackageReference Include="PropertyChanged.Fody" Version="3.1.3" />

with

    <PackageReference Include="Fody" Version="6.0.0" PrivateAssets="All" />
    <PackageReference Include="PropertyChanged.Fody" Version="3.1.3" PrivateAssets="All" />

@jahmai-ca
Copy link
Author

Still can reproduce with those lines. I tried adding to FodyDotNet3.csproj and to both FodyDotNet3.csproj/FodyDotNet3.Test.csproj with the same results. Note that to reproduce it you need to dotnet clean between builds because it builds after two attempts and then won't fail.

@jahmai-ca
Copy link
Author

jahmai-ca commented Oct 1, 2019

EDIT: Scratch below comment - I can see I didn't strongly name the binaries.
EDIT 2: Actually, it seems to be related to the original problem because building twice still works, but this time the version of Cecil is the same between Xamarin.Forms and Fody.

I made a new Xamarin.Forms package with a Xamarin.Forms.Build.Tasks.dll that referenced 0.11.0 of Mono.Cecil and the matching Mono binaries. The issue still occurred, but this time it couldn't find the newer version. This suggests the problem is not that there is multiple versions of Mono.Cecil being used since Fody and Xamarin.Forms were using the same version.

PS C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3.Test> dotnet build .\FodyDotNet3.Test.csproj
Microsoft (R) Build Engine version 16.3.0+0f4c62fea for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 120.04 ms for C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj.
  Restore completed in 239.31 ms for C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3.Test\FodyDotNet3.Test.csproj.
MSBUILD : error : Fody: An unhandled exception occurred: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Exception: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Could not load type 'Mono.Cecil.StrongNameKeyPair' from assembly 'Mono.Cecil, Version=0.11.0.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e'. [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Type: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : System.TypeLoadException [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : StackTrace: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.FindStrongNameKey() [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.Execute() in C:\projects\fody\FodyIsolated\InnerWeaver.cs:line 111 [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Source: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : FodyIsolated [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : TargetSite: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Void FindStrongNameKey() [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :  [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]

Build FAILED.

MSBUILD : error : Fody: An unhandled exception occurred: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Exception: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Could not load type 'Mono.Cecil.StrongNameKeyPair' from assembly 'Mono.Cecil, Version=0.11.0.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e'. [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Type: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : System.TypeLoadException [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : StackTrace: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.FindStrongNameKey() [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :    at InnerWeaver.Execute() in C:\projects\fody\FodyIsolated\InnerWeaver.cs:line 111 [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Source: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : FodyIsolated [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : TargetSite: [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error : Void FindStrongNameKey() [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
MSBUILD : error :  [C:\Users\Jahmai\Downloads\FodyDotNet3\FodyDotNet3\FodyDotNet3.csproj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:02.19

@carlossanlop
Copy link
Member

@livarcocc @nguerrera is this something you can help with?

@SimonCropp
Copy link

@jahmai can you try Fody version 6.0.4-beta.2

@jahmai-ca
Copy link
Author

@SimonCropp Confirmed. 6.0.4 resolves this issue in our product code. Workarounds removed :) Thanks!

@SimonCropp
Copy link

@jahmai thanks for closing the loop. BTW fody relies on users being being patrons to ensure it can continue to be maintained https://github.com/Fody/Home#community-backed

For anyone else who comes here. the problem was fody was using a Assembly.Load(bytes) where it should have been using a LoadContext.Load. weird the behavior for Assembly.Load(bytes) changed, seems it now ignores the strong name.

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 a pull request may close this issue.

5 participants