У меня есть большое решение WPF, работающее уже 2 года. Теперь мы запускаем среду автоматической сборки для этого решения, когда произошла самая странная вещь.
В 50% наших сборок я получаю следующую ошибку:
Исключение: невозможно преобразовать объект из
У меня есть большое решение WPF, которое работает уже 2 года. Теперь мы запускаем среду автоматической сборки для этого решения, когда произошла самая странная вещь.
В 50% наших сборок я получаю эту ошибку:
Исключение: невозможно преобразовать объект из
У меня есть большое решение WPF, которое работает уже 2 года. Теперь мы запускаем среду автоматической сборки для этого решения, когда произошла самая странная вещь.
В 50% наших сборок я получаю следующую ошибку:
Исключение: невозможно преобразовать объект из тип 'System.Windows.Controls.StackPanel' печатать 'System.Windows.Controls.Border'. Ошибка на объекте 'System.Windows.Controls.StackPanel' в файле разметки ...
Вроде достаточно просто. Проблема в том, что мой код выглядит следующим образом:
<UserControl x:Class="SiSM.Episode.Mishap.SpecializationList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Converters="clr-namespace:Utils.Converters;assembly=Utils" ...> <Border x:Name="root" BorderThickness="0.5"> <StackPanel x:Name="stackPanelRoot" VerticalAlignment="Stretch"> <Grid> ... </Grid> <StackPanel> ... </StackPanel> <ScrollViewer> ... </ScrollViewer> </StackPanel> </Border> </UserControl>
Ошибка здесь, потому что, если я переключаю стековую панель на док-панель, сообщение об ошибке меняется на док-панель.
Моя среда сборки следующая:
Скопируйте файл код в папку сборки:
private void CopyCode(string sourceDir, string destinationDir) { foreach (string dirPath in Directory.GetDirectories(sourceDir, "*", SearchOption.AllDirectories)) { if (!dirPath.Contains(".svn") && !dirPath.Contains(@"\bin") && !dirPath.Contains(@"\obj")) { Directory.CreateDirectory(dirPath.Replace(sourceDir, destinationDir)); } } foreach (string newPath in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories)) { if (!newPath.Contains(".svn") && !newPath.Contains(@"\bin") && !newPath.Contains(@"\obj")) { string dest = newPath.Replace(sourceDir, destinationDir); File.Copy(newPath, dest); } } Worker.ReportProgress(5, "Copy done"); }
И построение решения:
private void Compile(string buildConfiguration) { Engine engine = new Engine(); FileLogger logger = new FileLogger { Parameters = @"logfile=C:\builds\build.log" }; engine.RegisterLogger(logger); BuildPropertyGroup bpg = new BuildPropertyGroup(); bpg.SetProperty("Configuration", buildConfiguration, true); engine.GlobalProperties = bpg; var project = new Project(engine); project.Load(ProjectFilePath); bool success = engine.BuildProject(project); engine.UnregisterAllLoggers(); }
Здесь что-то не так или есть какая-либо известная проблема с WPF и механизмом сборки Microsoft?
Редактировать 1
Я обнаружил, когда возникает ошибка. Если я запускаю приложение автоматической сборки в первый раз, оно всегда выполняется успешно, но если я запускаю его в течение секунды, возникает указанная выше ошибка. Так что, вероятно, я забыл закрыть то, что создает ошибку.
Я добавил
engine.Shutdown ();
в конец метода Compile, но это не устранило проблему.Изменить 2
Благодаря предложению @swiszcz, только что нашел самую странную вещь. Файл SpecializationList.g.cs (в папке obj) изменяется между первой и второй сборкой
Первая сборка
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { switch (connectionId) { case 1: this.stackPanelRoot = ((System.Windows.Controls.StackPanel)(target)); return; case 2: #line 63 "..\..\..\Mishap\SpecializationList.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.buttonShowGlobalView_Click); ...
Вторая сборка
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { switch (connectionId) { case 2: this.stackPanelRoot = ((System.Windows.Controls.StackPanel)(target)); return; case 3: ...
Он увеличивается на 1 при условии переключения, а во второй сборке он не может преобразовать Кнопка (случай 2) для StackPanel (случай 1).