У меня странная маленькая ошибка, возникающая в MvvmLight v4 (сборка .NET 4, v4.0.0.0 / BL0016, установленная через NuGet).В моем проекте модель представления (которая наследуется от ViewModelBase), которая представляет визуальный элемент, нарисованный на холсте.Эта модель представления имеет типичные свойства Top / Left / Width / Height, каждое из которых вызывает RaisePropertyChanged, например,
public double Width
{
get { return _width; }
set
{
if (Math.Abs(_width - value) < DeltaEpsilon)
{
return;
}
_width = value;
RaisePropertyChanged();
}
}
В ответ на различные события модель представления также имеет метод, который вычисляет положение и размерывизуальный элемент и соответствующим образом устанавливает свойства:
public void CalculateSize()
{
Width = DoSomeCalculation();
// Calculate other settings...
}
У меня есть несколько модульных тестов, которые проверяют, что вычисления выполнены правильно, и когда я запускаю в режиме отладки, тесты работают нормально.Однако, если я запускаю в режиме Release, тесты не выполняются, за исключением следующего:
SetUp : System.InvalidOperationException : This method can only by invoked within a property setter.
at GalaSoft.MvvmLight.ObservableObject.RaisePropertyChanged()
at MyProject.ViewModels.TableViewModel.CalculateSize() in TableViewModel.cs: line 154
, где строка 154 в TableViewModel - это строка Width = DoSomeCalculation ().Другими словами, когда мой метод пытается установить значение свойства, MvvmLight жалуется, что я не вызываю RaisePropertyChanged из установщика свойства.Я пытался отладить тест (используя отладчик теста Reshaper), но когда я запускаю отладчик, тест проходит (может быть, отладка модульного теста в Resharper переводит его в режим отладки, даже если он уже находится в режиме Release?).в самом приложении.
Есть идеи, почему режим Release нарушает код?Есть ли что-то в том, как компилятор оптимизирует код, который нарушает использование StackTrace в методе RaisePropertyChanged () ObservableObject?Обратите внимание, что в приведенном выше исключении не отображается вводимый параметр Width, он переходит прямо из метода CalculateSize к исключению.