2017-08-30 1 views
0

j'ai asked for help sur le forum AAPC, mais je n'ai pas été en mesure de résoudre ce encore. J'ai créé un test VS2015 solution qui démontre les problèmes que je rencontre. J'utilise CSLA 4.6.603 dans Outlook, Word, Excel et PowerPoint. Après avoir défini Csla.ApplicationContext.User, un SerializationException peut être lancé lors de l'affichage d'un Form ou MessageBox, ou même de la lecture de code XML.C# SerializationException dans Office 2013/2016 VSTO add-ins avec AAPC

L'exemple le plus simple du problème est le suivant:

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); 
    } 
} 

Dans la solution d'essai, il est un autre exemple qui jette le même SerializationException en essayant de lire XML via dataSet.ReadXml(tempFileName, XmlReadMode.InferSchema);

Je traitais la AppDomain.CurrentDomain.AssemblyResolve événement, et CSLA est répertorié dans AppDomain.CurrentDomain.GetAssemblies() juste avant que l'exception soit levée.

La solution de test a une identité personnalisée très basique, un objet métier de base qui lit à partir d'un fichier XML généré, et une forme avec trois boutons.

Si vous définissez le projet WindowsUI que le projet StartUp et l'exécuter, chaque bouton sous la forme principale doit réussir, sans exception jetés.

Définissez le projet WordAddIn comme projet StartUp et exécutez-le. Word démarre et le même formulaire est affiché en tant que les charges de complément. Le premier bouton réussit, mais les deux boutons suivants lèvent des exceptions. Consultez la sortie de débogage pour plus de détails ou définissez un point d'arrêt. La même chose est vraie pour le projet OutlookAddIn.

Comme d'autres l'ont souligné plus tôt dans la discussion sur le forum AAPC, cela est causé par ou lié à .NET ne pas résoudre les assemblées. L'événement AssemblyResolve peut être la réponse, je n'ai juste pas été en mesure de le comprendre.

Toute aide serait grandement appréciée.

Répondre

0

Avec l'aide d'Ingo sur le forum de l'AAPC, je pense que nous avons trouvé une solution de contournement.

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(); 
} 

Ce que j'ai trouvé est que, avant toute interface est affichée par un gestionnaire d'événements de commande de ruban, nous avons besoin de ré-exécuter le code de contournement et réaffectant l'utilisateur actuel est suffisant. Cela a l'air ridicule, mais ça marche.

/// <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; 
}