Пользовательская задача MSBuild C# вызывает исключение MissingMethodExceptionC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательская задача MSBuild C# вызывает исключение MissingMethodException

Сообщение Anonymous »

У меня очень странная ситуация. В настоящее время я пишу специальную задачу MSBuild на C#, которую хочу использовать в процессе сборки. Эта задача ссылается на пакет NuGet, который вызывает метод расширения HttpClient Task GetFromJsonAsync(этот клиент HttpClient, string? requestUri, JsonTypeInfo jsonTypeInfo, CancellationToken cancelToken), который реализован в сборке System.Net.Http.Json. Моя собственная задача ориентирована на .NET10, а пакет NuGet — на .NET9.
Я добавил задачу в свою сборку следующим образом: Когда я запускаю задачу во время сборки, я получаю следующее исключение:

Код: Выделить всё

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)'.
Теперь, когда я создаю консольное приложение, которое ссылается на сборку с моей пользовательской задачей, а затем выполняю задачу, используя следующий код:

Код: Выделить всё

MyTask task = new MyTask();
task.BuildEngine = new BuildEngine();
task.Execute();
задача выполняется без каких-либо исключений во время выполнения.
Чтобы найти причину этого, я попробовал и исследовал следующие вещи:
  • Клонировал репозиторий исходного кода пакета NuGet и изменил проекты на .NET10 вместо .NET9 и использовал свою собственную сборку пакета NuGet. Это не устранило проблему, и исключение MissingMethodException по-прежнему выдается.
  • Запустите Process Monitor sysinternals, чтобы узнать, какие библиотеки DLL загружаются во время выполнения задачи во время сборки. Я увидел, что файл C:\Program Files\dotnet\shared\Microsoft.NETCore.App\10.0.1\System.Net.Http.Json.dll загружен правильно, и загрузил этот файл в ILSpy, чтобы проверить, действительно ли метод существует в этой сборке, и он существует.
  • Сравнил подпись метода GetFromJsonAsync в .NET9 и .NET10 и похоже, нет разницы в подписи, даже атрибут параметра для параметра requestUri один и тот же.
  • Добавлен обработчик событий в AppDomain.CurrentDomain.AssemblyLoad, который просто регистрирует, какая сборка загружена, и сборка System.Net.Http.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 регистрируется как загруженный (подтверждая то, что уже указано в Process Monitor).
  • Просмотрел IL-код метода в пакете NuGet, чтобы узнать, какой метод на самом деле вызывается: вызов класса [System.Runtime]System.Threading.Tasks.Task`1 [System.Net.Http.Json]System.Net.Http.Json.HttpClientJsonExtensions::GetFromJsonAsync(класс [System.Net.Http]System.Net.Http.HttpClient, строка, класс [System.Text.Json]System.Text.Json.Serialization.Metadata.JsonTypeInfo`1, тип значения [System.Runtime]System.Threading.CancellationToken). Мне кажется, что он хочет вызвать метод из сборки System.Net.Http.Json, как и ожидалось.
Я использую Visual Studio версии 18.1.1 (последняя) и собираю из IDE, но при выполнении сборки с помощью MSBuild в командной строке также происходит сбой. Версия, о которой сообщает MSBuild:

Код: Выделить всё

MSBuild version 18.0.5+e22287bf1 for .NET Framework
18.0.5.56406
Можно ли что-нибудь попробовать? Что мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/798 ... dexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»