Ошибка xamlparser после развертывания clickonce. Сбой приложения после установки

Я построил приложение WPF с Visual Studio 2008 и создал для него установщик. До сих пор работает отлично. Я понял, что в нем нет функции автоматического обновления, и после попытки нескольких решений я решил попробовать сразу же развернуть. При успешном развертывании на сетевом сервере я заметил, что после установки загруженного приложения происходит сбой приложения. Он жалуется на это:

Невозможно создать экземпляр 'Login', определенный в сборке 'MyApplication, Version=1.0.0.0, Culture= нейтральный, PublicKeyToken=null'. Исключение было брошено целью вызова. Ошибка в файле разметки "MyApplication; component / login.xaml" Строка 1, Позиция 9.

вот трассировка стека

в System.Windows.Markup.XamlParseException.ThrowException (Строковое сообщение, Исключение innerException, Int32 lineNumber, Int32 linePosition, Uri baseUri, XamlObjectIds currentXamlObjectIds, XamlObjectIds contextXamlObjectIds, тип objectType)
в System.Windows.Markup.XamlParseException.ThrowException(ParserContext parserContext, Int32 lineNumber, Int32 linePosition, сообщение String, исключение innerException) в System.Windows.Markup.BamlRecordReader.ThrowExceptionWithLine (строковое сообщение, исключение innerException)
в System.Windows.Markup.BamlRecordReader.CreateInstanceFromType(тип type, int16 typeId, логический throwOnFail)
в System.Windows.Markup.BamlRecordReader.GetElementAndFlags(BamlElementStartRecord bamlElementStartRecord, Объект & элемент, ReaderFlags& flags, Тип & delayCreatedType, Int16& delayCreatedTypeId)
в System.Windows.Markup.BamlRecordReader.BaseReadElementStartRecord(BamlElementStartRecord bamlElementRecord)
в System.Windows.Markup.BamlRecordReader.ReadElementStartRecord(BamlElementStartRecord bamlElementRecord)
в System.Windows.Markup.BamlRecordReader.ReadRecord(BamlRecord bamlRecord)
в System.Windows.Markup.BamlRecordReader.Read(логическое значение singleRecord)
в System.Windows.Markup.TreeBuilderBamlTranslator.ParseFragment()
в System.Windows.Markup.TreeBuilder.Parse()
в System.Windows.Markup.XamlReader.LoadBaml(Потоковый поток, ParserContext parserContext, родительский объект, логическое значение closeStream)
в System.Windows.Application.LoadBamlStreamWithSyncInfo(потоковый поток, ParserContext pc)
в System.Windows.Application.LoadComponent(Uri resourceLocator, логическое значение bSkipJournaledProperties)
в System.Windows.Application.DoStartup()
в System.Windows.Application.<. ctor>b__0 (объект не используется)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler)
в System.Windows.Threading.Dispatcher.WrappedInvoke(обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter, делегат catchHandler)
в System.Windows.Threading.DispatcherOperation.InvokeImpl()
в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(состояние объекта)
в System.Threading.ExecutionContext.runTryCode(объект userData)
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(код TryCode, код возврата CleanupCode, объект userData объекта)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
в System.Windows.Threading.DispatcherOperation.Invoke()
в System.Windows.Threading.Dispatcher.ProcessQueue()
в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler)
в System.Windows.Threading.Dispatcher.WrappedInvoke(обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter, делегат catchHandler)
в System.Windows.Threading.Dispatcher.InvokeImpl(приоритет DispatcherPriority, время ожидания TimeSpan, метод Delegate, аргументы объекта, логическое значение isSingleParameter)
в System.Windows.Threading.Dispatcher.Invoke(приоритет DispatcherPriority, метод делегата, объектный аргумент)
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl(фрейм DispatcherFrame)
в System.Windows.Threading.Dispatcher.PushFrame(фрейм DispatcherFrame)
в System.Windows.Threading.Dispatcher.Run()
в System.Windows.Application.RunDispatcher(игнорирование объекта)
в System.Windows.Application.RunInternal(окно окна)
в System.Windows.Application.Run(окно окна)
в System.Windows.Application.Run()
в myApplication.App.Main()

вот только регион, на который указывает отладчик

<Window x:Class="MyApplication.Login"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:src="clr-namespace:MyApplication"
    xmlns:UI="clr-namespace:UI;assembly=UI"
Title="My Application"  Height="400" Width="550" ResizeMode="NoResize" WindowStyle="ThreeDBorderWindow" WindowStartupLocation="CenterScreen" Name="Logine" Loaded="Logine_Loaded" Closed="Logine_Closed" Icon="orLogo.ico">

Но версия установщика, как в MSI из проекта установки, работает нормально. Поэтому я не могу видеть, откуда происходит ошибка, так как я могу иметь представление дизайна.
Вопрос 1: Есть ли у кого-нибудь похожая проблема или это известная проблема?
Вопрос 2: Если это известная проблема, то каковы альтернативы. Я мог бы отказаться от clickonce, но тогда моя функция автоматического обновления будет потеряна (так как нет ни одной, которая не является ovekill или серьезно устарела, которую я могу найти прямо сейчас),
Спасибо, что прочитали это и указали мне правильное направление.

1 ответ

Решение

Если вы перейдете в кэш ClickOnce и найдете исполняемый файл для своего приложения и дважды щелкните по нему, все равно произойдет ли сбой? Если так, то это не проблема ClickOnce как таковая. Возможно, в вашем развертывании отсутствует какая-либо сборка, которая требуется. Или вы делаете что-то, что ClickOnce не разрешает, например, доступ к папке, требующей прав администратора.

Вы также можете попробовать запустить его из папки \bin\release после выполнения сборки, но это не скажет вам, если у вас на вашей машине есть сборка, которая не развертывается.

Кэш ClickOnce в Windows 7 (и Vista) находится здесь:
C: \ Users \ имя пользователя \AppData\Local\Apps\2.0\obfuscatedfolder\obfuscatedfolder

Оттуда, для приложения win forms, он создает две папки, одну с именем xxxx...exe_etc и одну с именем xxxx...tion_etc... ту, которая начинается с xxxx_tion (где xxxx = первые четыре символа имени вашей сборки) это то, откуда запускается приложение. Я не уверен, совпадают ли имена папок для приложения WPF, но, надеюсь, они не слишком разные. Исполняемый файл будет только в одной папке. (И да, вы могли бы подумать, что это будет в папке xxxx...exe_etc, но это не так.)

РЕДАКТИРОВАТЬ - ДОБАВЛЕННАЯ ИНФОРМАЦИЯ

По вопросу отсутствующих изображений: включены ли они в проект в виде файлов? Если это так, убедитесь, что для действия сборки задано значение "content", а для свойства "copy to output directory" установлено значение "copy Always". В противном случае он не будет включать их в развертывание.

Для базы данных та же проблема. Он должен быть включен в проект, и свойства должны быть установлены соответствующим образом (установите для параметра "копировать..." значение "копировать, если новее"). ТАКЖЕ откройте диалоговое окно "Файлы приложения" и посмотрите, не помечено ли оно как "Включить (данные)". Если это так, то он развертывается в каталоге данных. Если вы развернете его таким образом, то при публикации новой версии он скопирует данные в новые папки. Вы можете найти его программно, используя свойство ApplicationDeployment.DataDirectory.

Как правило, я не рекомендую доверять ваши данные ClickOnce. Если вы внедрили что-то в виде данных, а отметка даты / времени в вашей локальной версии изменится, ClickOnce развернет новую версию и поместит старую версию в подпапку с именем.\ Pre. Для меня это опасно, потому что вы можете случайно изменить данные. SQLCE изменяет метку даты / времени, если вы просто открываете базу данных, чтобы посмотреть на структуры таблиц. Поэтому я перемещаю данные и занимаюсь обновлением базы данных самостоятельно. Если вы хотите получить больше информации об этом, ознакомьтесь с моим постом в блоге о защите ваших данных от обновлений ClickOnce.

Другие вопросы по тегам