проблема периодической сборки в приложении WPF

У меня есть большое решение 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).

18
задан dcarneiro 1 April 2011 в 17:23
поделиться