2017-02-21 52 views
0

Я не смог разобраться в этом сам, поэтому подумал, что дам вам шанс на это.Аварийная ошибка WPF в Windows 10 при попытке получить доступ к адресной книге Outlook

Сама программа сравнивает список сотрудников с PDL из адресной книги Outlook. Проблема в том, что моя форма WPF отлично работает на Windows 7, однако при сбое программы в Windows 10 при попытке получить доступ к книге адресов Outlook, все остальное работает так, как предполагается.

Это код для доступа Перспективы:

public class Outlookhelper 
    { 

    public List<String> GetDistributionListMembers() 
    { 
     List <String> returnlist = new List <String>(); 
     Outlook.Application application = new Outlook.Application(); 
     Outlook.SelectNamesDialog snd = 
      application.Session.GetSelectNamesDialog(); 
     Outlook.AddressLists addrLists = 
      application.Session.AddressLists; 
     foreach (Outlook.AddressList addrList in addrLists) 
     { 
      if (addrList.Name == "Global Adress List") 
      { 
       snd.InitialAddressList = addrList; 
       break; 
      } 
     } 
     snd.NumberOfRecipientSelectors = 
      Outlook.OlRecipientSelectors.olShowTo; 
     snd.ToLabel = "D/L"; 
     snd.ShowOnlyInitialAddressList = true; 
     snd.AllowMultipleSelection = false; 
     snd.Display(); 
     if (snd.Recipients.Count > 0) 
     { 
      Outlook.AddressEntry addrEntry = 
       snd.Recipients[1].AddressEntry; 
      if (addrEntry.AddressEntryUserType == 
       Outlook.OlAddressEntryUserType. 
       olExchangeDistributionListAddressEntry) 
      { 
       Outlook.ExchangeDistributionList exchDL = 
        addrEntry.GetExchangeDistributionList(); 
       Outlook.AddressEntries addrEntries = 
        exchDL.GetExchangeDistributionListMembers(); 
       if (addrEntries != null) 
        foreach (Outlook.AddressEntry exchDLMember 
         in addrEntries) 
        { 
         //System.Windows.Forms.MessageBox.Show(exchDLMember.Name); 
         returnlist.Add(exchDLMember.Name); 
        } 
      } 
     } 
    return returnlist; 
    } 
} 

И это сообщение об ошибке я получаю от просмотра событий на Windows 10 машины:

Application: PDL Updater.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.Runtime.InteropServices.COMException 
    at 



System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(System.RuntimeType) 
    at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(System.RuntimeType) 
    at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(System.RuntimeType, System.Object[], Boolean) 
    at System.RuntimeTypeHandle.CreateInstance(System.RuntimeType, Boolean, Boolean, Boolean ByRef, System.RuntimeMethodHandleInternal ByRef, Boolean ByRef) 
    at System.RuntimeType.CreateInstanceSlow(Boolean, Boolean, Boolean, System.Threading.StackCrawlMark ByRef) 
    at System.Activator.CreateInstance(System.Type, Boolean) 
    at System.Activator.CreateInstance(System.Type) 
    at PDLUpdater.Outlookhelper.GetDistributionListMembers() 
    at PDLUpdater.MainWindow.getPDLnames_Click(System.Object, System.Windows.RoutedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean) 
    at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs) 
    at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
    at System.Windows.Controls.Button.OnClick() 
    at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs) 
    at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean) 
    at System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject, System.Windows.RoutedEventArgs, System.Windows.RoutedEvent) 
    at System.Windows.UIElement.OnMouseUpThunk(System.Object, System.Windows.Input.MouseButtonEventArgs) 
    at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean) 
    at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs) 
    at System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs) 
    at System.Windows.Input.InputManager.ProcessStagingArea() 
    at System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport) 
    at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr, System.Windows.Input.InputMode, Int32, System.Windows.Input.RawMouseActions, Int32, Int32, Int32) 
    at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr, MS.Internal.Interop.WindowMessage, IntPtr, IntPtr, Boolean ByRef) 
    at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame) 
    at System.Windows.Application.RunDispatcher(System.Object) 
    at System.Windows.Application.RunInternal(System.Windows.Window) 
    at Contacts.App.Main() 

И

Faulting application name: PDL Updater.exe, version: 1.2.9.0, time stamp: 0x58aae81e 
Faulting module name: KERNELBASE.dll, version: 10.0.10586.589, time stamp: 0x57cf948c 
Exception code: 0xe0434352 
Fault offset: 0x0000000000071f28 
Faulting process id: 0x2948 
Faulting application start time: 0x01d28b7a4e508b20 
Faulting application path: C:\Program Files\PDL Updater\PDL Updater.exe 
Faulting module path: C:\WINDOWS\system32\KERNELBASE.dll 
Report Id: dd5f897a-24c9-4dd0-979e-4f0cbd747a94 
Faulting package full name: 
Faulting package-relative application ID: 

* Редактировать Это исключение Сообщение меня бросает, надеюсь, что это поможет: Error Message

Если вам нужно что-нибудь еще, я был бы рад предоставить его. С нетерпением ждем этого, так что спасибо вам уже заранее!

+0

Итак, когда вы запускаете его в отладке, на какой строке он умирает? – BugFinder

+0

Добавьте обработку исключений в обработчик событий кликов и запишите все исключение, включая его сообщение, стек вызовов и т. Д. Вы можете легко справиться с 'Exception.ToString()'. Вы пытаетесь вызвать внешнее приложение - всегда есть проблема. Недостающее приложение, неверная версия interop, независимо от того, –

ответ

0

Try ориентировать платформу:

В Visual Studio → Свойства проекта → в целевом Сложение вкладке → платформы = X86/X64/Любой процессор

Изменение целевой платформы и проверить свои заявление.

0

Вы запускаете код на вторичной теме?

Помните, что приложения Office используют модель с одной резьбой. Вы должны использовать OOM только в основном потоке. Если вы хотите использовать многопоточность, вам нужно рассмотреть использование низкоуровневого API - Extended MAPI. Или просто оболочка вокруг этого API (например, Redemption).

+0

Можете ли вы рассказать об этом? Я только недавно начал с C# и должен был взять код, написанный кем-то другим. Будет ли это проблемой, которая возникает только в Windows 10? Меня озадачивает, что я не получаю последовательной ошибки в обеих системах. Код для этой программы был взят из двух отдельных программ, которые отлично работают в Windows 10. Единственное различие заключалось в том, что до того, как это было приложение Windows Forms. – Lennart

+0

Вы запускаете код в основном потоке? –

+0

Он работает по основной теме. – Lennart

0

Похоже, что он взрывается, когда вы пытаетесь создать экземпляр объекта Outlook.Application.

Убедитесь, что Outlook и приложение работают в одном контексте безопасности. Является ли приложение запущенным с повышенными привилегиями (Run As Administrator)?

+0

Visual Study всегда запрашивает права администратора, когда я пытаюсь запустить приложение.Созданный файл установки работает с правами администратора. Я разделил код на два раздела, чтобы проверить, работает ли Outlook. Если Outlook не работает, приложение работает нормально. Только изменение кода для запуска iflook выглядит так: 'oApp = Marshal.GetActiveObject (« Outlook.Application ») как Outlook.Application;' , который является точно такой же строкой, где приложение не работает – Lennart

+0

Только более старые версии VS делают это , Права на установку не имеют никакого значения - главное - это контекст безопасности - он должен быть одинаковым для * обоих приложений, когда ваш код запущен. –

+0

Но как я мог это достичь? Я создаю setup .exe с Inno Setup, для которого требуются права администратора, чтобы установить в Program Files и проверить, установлена ​​ли .net Framework (и установите ее, если это не так). Если я запустил установку Inno с помощью параметра «PrivilegesRequired = lower», приложение работает по назначению, но не может проверить на .net и не может установить его в Program Files. Можете ли вы придумать решение для этого? Может быть, способ изменить Привилегии в Inno Setup после установки, если это возможно? – Lennart