Die benutzerdefinierte MSBuild C#-Aufgabe löst eine MissingMethodException ausC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Die benutzerdefinierte MSBuild C#-Aufgabe löst eine MissingMethodException aus

Post by Anonymous »

Ich habe eine sehr seltsame Situation. Derzeit schreibe ich eine benutzerdefinierte MSBuild-Aufgabe in C#, die ich in meinem Build-Prozess verwenden möchte. Diese Aufgabe verweist auf ein NuGet-Paket, das die HttpClient-Erweiterungsmethode Task GetFromJsonAsync(this HttpClient client, string? requestUri, JsonTypeInfo jsonTypeInfo, CancellationToken cancellingToken) aufruft, die in der System.Net.Http.Json-Assembly implementiert ist. Meine eigene Aufgabe ist auf .NET10 ausgerichtet und das NuGet-Paket ist auf .NET9 ausgerichtet.
Ich habe die Aufgabe auf folgende Weise zu meinem Build hinzugefügt:

Code: Select all




Wenn ich die Aufgabe während des Builds ausführe, erhalte ich die folgende Ausnahme:

Code: Select all

error MSB4018: System.MissingMethodException->Microsoft.Build.Framework.BuildException.GenericBuildTransferredException: Method not found: 'System.Threading.Tasks.Task`1 System.Net.Http.Json.HttpClientJsonExtensions.GetFromJsonAsync(System.Net.Http.HttpClient, System.String, System.Text.Json.Serialization.Metadata.JsonTypeInfo`1, System.Threading.CancellationToken)'.
Wenn ich jetzt eine Konsolenanwendung erstelle, die mit meiner benutzerdefinierten Aufgabe auf die Assembly verweist, und dann die Aufgabe ausführe, verwende ich den folgenden Code:

Code: Select all

MyTask task = new MyTask();
task.BuildEngine = new BuildEngine();
task.Execute();
Die Aufgabe ist ohne Laufzeitausnahmen erfolgreich.
Um die Ursache dafür zu finden, habe ich Folgendes versucht und untersucht:
  • Klonen Sie das NuGet-Paketquell-Repository und ändern Sie die Projekte so, dass sie auf .NET10 statt auf .NET9 abzielen, und verwenden Sie meinen benutzerdefinierten NuGet-Paketbuild. Dadurch wurde das Problem nicht behoben und die MissingMethodException wird immer noch ausgelöst.
  • Führen Sie den Prozessmonitor von sysinternals aus, um zu sehen, ob welche DLLs während der Ausführung der Aufgabe während eines Builds geladen werden. Ich habe gesehen, dass die Datei C:\Program Files\dotnet\shared\Microsoft.NETCore.App\10.0.1\System.Net.Http.Json.dll korrekt geladen wurde, und habe diese Datei in ILSpy geladen, um zu sehen, ob die Methode tatsächlich in dieser Assembly vorhanden ist, und das ist der Fall.
  • Verglichen die Signatur der GetFromJsonAsync-Methode in .NET9 und .NET10 und es scheint nicht so zu sein Es kann einen Unterschied in der Signatur geben, sogar das Parameterattribut für den Parameter requestUri ist dasselbe.
  • Es wurde ein Ereignishandler zu AppDomain.CurrentDomain.AssemblyLoad hinzugefügt, der nur protokolliert, welche Assembly geladen wird, und die Assembly wird als vorhanden protokolliert geladen (bestätigt, was Process Monitor bereits angegeben hat).
  • Sehen Sie sich die IL der Methode im NuGet-Paket an, um zu sehen, welche Methode tatsächlich aufgerufen wird: call class [System.Runtime]System.Threading.Tasks.Task`1 [System.Net.Http.Json]System.Net.Http.Json.HttpClientJsonExtensions::GetFromJsonAsync(class [System.Net.Http]System.Net.Http.HttpClient, string, class [System.Text.Json]System.Text.Json.Serialization.Metadata.JsonTypeInfo`1, valuetype [System.Runtime]System.Threading.CancellationToken). Es scheint mir, dass die Methode wie erwartet aus der System.Net.Http.Json-Assembly aufgerufen werden soll.
Ich verwende Visual Studio Version 18.1.1 (neueste Version) und erstelle aus der IDE, aber es schlägt auch fehl, wenn der Build mit MSBuild in der Befehlszeile ausgeführt wird. Die von MSBuild gemeldete Version ist:

Code: Select all

MSBuild version 18.0.5+e22287bf1 for .NET Framework
18.0.5.56406
Kann ich irgendetwas ausprobieren? Was übersehe ich hier?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post