2017-08-30 91 views
0

我在CSLA論壇上第一個asked for help,但我還沒有能夠解決這個問題。我創建了一個test VS2015 solution,它演示了我遇到的問題。Office 2013/2016中的C#SerializationException CSLA的VSTO加載項

我在Outlook,Word,Excel和PowerPoint中使用CSLA 4.6.603。在設置Csla.ApplicationContext.User之後,當顯示FormMessageBox或甚至讀取XML時,可以拋出SerializationException

問題的最簡單的例子是:

private void MessageThrows(object sender, EventArgs e) 
{ 
    // This message displays correctly 
    MessageBox.Show("About to set user to UnauthenticatedPrincipal. " + 
        "Check Debug Output to see exception.", 
        "Before UnauthenticatedPrincipal"); 

    // The user is set correctly with no exception 
    Csla.ApplicationContext.User = new Csla.Security.UnauthenticatedPrincipal(); 

    try 
    { 
     // The following message throws: 

     // System.Runtime.Serialization.SerializationException: 
     // Type is not resolved for member 'Csla.Security.UnauthenticatedPrincipal,Csla, 
     // Version =4.6.603.0, 
     // Culture =neutral, 
     // PublicKeyToken =93be5fdc093e4c30'. 

     MessageBox.Show("The user has been set to UnauthenticatedPrincipal.", 
         "After UnauthenticatedPrincipal"); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex); 
    } 
} 

在測試解決方案有試圖通過dataSet.ReadXml(tempFileName, XmlReadMode.InferSchema);

我處理AppDomain.CurrentDomain.AssemblyResolve讀取XML時拋出相同SerializationException另一個例子事件和CSLA在AppDomain.CurrentDomain.GetAssemblies()中列出,就在引發異常之前。

測試解決方案有一個非常基本的自定義標識,一個從生成的XML文件讀取的基本業務對象和一個帶有三個按鈕的表單。

如果將WindowsUI項目設置爲StartUp項目並運行它,則主窗體中的每個按鈕都應成功,並且不會引發任何異常。

將WordAddIn項目設置爲啓動項目並運行它。 Word啓動並顯示與加載項加載相同的表單。第一個按鈕成功,但接下來的兩個按鈕會引發異常。有關詳細信息,請參閱調試輸出或設置斷點。 OutlookAddIn項目也是如此。正如其他人早些時候在CSLA論壇主題中指出的那樣,這是由於.NET無法解析程序集而導致的或與之相關的。 AssemblyResolve事件可能是答案,我只是無法弄清楚。

任何幫助將不勝感激。

回答

0

在Ingo CSLA論壇的幫助下,我認爲我們找到了解決方法。

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Csla.ApplicationContext.PropertyChangedMode = Csla.ApplicationContext.PropertyChangedModes.Windows; 

    Csla.ApplicationContext.ContextManager  = new Csla.Windows.ApplicationContextManager(); 

    // Workaround to prevent 'SerializationException' in VSTO add-in 

    // 1. Force initialisation of ConfigurationManager 
    System.Configuration.ConfigurationManager.GetSection("Dummy"); 

    // 2. Set UnauthenticatedPrincipal explicitly after 
    // setting the Csla.ApplicationContextManager 
    Csla.ApplicationContext.User = new Csla.Security.UnauthenticatedPrincipal(); 
} 

我發現的是,在通過任何色帶控制的事件處理程序顯示的任何用戶界面,我們需要重新運行代碼的解決方法,並重新分配當前用戶是足夠的。它看起來很荒謬,但它起作用。

/// <summary> 
/// Microsoft Office add-ins can experience 
/// <code>System.Runtime.Serialization.SerializationException</code> 
/// "Type is not resolved for member Csla.Security.UnauthenticatedPrincipal". 
/// Calling this method before showing any UI works around the problem. 
/// </summary> 
public static void ExceptionWorkaround(bool setUnauthenticatedPrincipal = false) 
{ 
    // 1. Force initialisation of ConfigurationManager 
    ConfigurationManager.GetSection("Dummy"); 

    // 2. Set User explicitly 
    if (setUnauthenticatedPrincipal) 
     Csla.ApplicationContext.User = new UnauthenticatedPrincipal(); 
    else 
     Csla.ApplicationContext.User = Csla.ApplicationContext.User; 
} 
相關問題