2017-08-30 54 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; 
} 
相关问题