Метод реактивного расширения работает в сборке, ориентированной на net48, но выдает MissingMethodException, нацеленной нC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Метод реактивного расширения работает в сборке, ориентированной на net48, но выдает MissingMethodException, нацеленной н

Сообщение Anonymous »

У меня есть метод расширения, определенный в библиотеке классов (назовем его My.Extensions.Reactive):

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

public static class ObservableExtensions
{
/// 
/// Returns a sequence that is generated by comparing each of an underlying Observable's emitted values to the value which was emitted first.
/// The first item emitted by this Observable is the result of comparing the first item to itself.
/// 
public static IObservable RelativeToFirst(this IObservable observable, Func selector)
{
// .Publish ensures the underlying stream is not disposed until this stream is unsubscribed.
return observable.Publish(published => published.Take(1)
.CombineLatest(published)
.Select(((TValue First, TValue Current) combined) => selector(combined.First, combined.Current)));
}
}
У меня есть пример модульного теста, определенный в проекте xUnit, предназначенном для .NET Framework 4.8.

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

public class ObservableExtensionsTests
{
[Fact]
public async Task RelativeToFirst()
{
var input = Observable.Range(5, 10);

var expected = Observable.Range(0, 10);

var result = input.RelativeToFirst((initial, current) => current - initial);

Assert.Equal(await expected.ToArray(), await result.ToArray());
}
}
Если My.Extensions.Reactive.csproj нацелен на net48, модульный тест проходит успешно.
Мне нужен My .Extensions.Reactive для работы с netstandard2.0, чтобы я мог использовать ее в проектах, ориентированных на более новые версии .NET, сохраняя при этом поддержку .NET 4.8. Однако когда я меняю TargetFramework на netstandard2.0 и переустанавливаю пакеты NuGet System.Reactive 6.0.1, модульный тест, который по-прежнему нацелен на net48, завершается сбоем, выдавая ошибку следующий вывод xUnit:

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

System.MissingMethodException
Method not found: 'System.IObservable`1 System.Reactive.Linq.ObservableEx.CombineLatest(System.IObservable`1, System.IObservable`1)'.
at My.Extensions.Reactive.ObservableExtensions.c__DisplayClass2_0`2.b__0(IObservable`1 published)
at System.Reactive.Linq.ObservableImpl.Multicast`3._.Run(Multicast`3 parent)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Reactive.Subjects.AsyncSubject`1.GetResult()
at My.Extensions.Reactive_Test.ObservableExtensionsTests.d__0.MoveNext() in redacted\ObservableExtensionsTests.cs:line 19
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.TestInvoker`1.c__DisplayClass47_0.d.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/Runners/TestInvoker.cs:line 259
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExecutionTimer.d__4.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/ExecutionTimer.cs:line 48
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExceptionAggregator.d__9.MoveNext() in /_/src/xunit.core/Sdk/ExceptionAggregator.cs:line 90
Почему это происходит? Пакет NuGet System.Reactive включает в себя специальную информацию о таргетинге для netstandard2.0, среди других опций, а проекты .NET Framework 4.8 должны иметь возможность принимать зависимости от библиотек .NET Standard 2.0, верно?
Отсутствующий метод System.Reactive.Linq.ObservableEx.CombineLatest() прост для перехода к использованию метода «Перейти к определению» Visual Studio. Ошибка модульного теста возникает во время ошибки выполнения, а не во время компиляции. Тестовый проект не ссылается напрямую на пакет NuGet System.Reactive, но требуемая DLL, похоже, присутствует в папке bin\x64 тестового проекта.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... s-missingm
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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