2010-03-02 10 views
1

Il a fallu du temps pour résoudre ce problème et les conclusions sont intéressantes.Office Addin termine l'hôte en utilisant WCF

Notre Office (Word/Excel/PowerPoint) add-in envoie une demande à notre service WCF personnalisé, l'application Office d'hébergement se termine, laissant cette entrée dans le journal d'application:

Provider: .NET Runtime 
EventID: 1023 
Level: 2 
Task: 0 
Keywords: 0x80000000000000 
Channel: Application 
EventData: .NET Runtime version 2.0.50727.4200 - Fatal Execution Engine Error (6BC47B3E) (80131506) 

Pour reproduire ce, créer un nouveau projet «Word 2007 Add-in» dans Visual Studio 2008. Ajouter des références à System.ServiceModel et System.Runtime.Serialization. Modifier votre classe ThisAddin pour contenir ce code, que je crois est le code minimum nécessaire pour reproduire ce comportement:

[Serializable] 
public class CustomQuery { } 
[Serializable] 
public class CustomQueryCollection : ReadOnlyCollection<CustomQuery> 
{ 
    public CustomQueryCollection(IEnumerable<CustomQuery> queries) 
     : base(queries.ToArray()) 
    { } 
} 
[Serializable] 
[KnownType(typeof(CustomQueryCollection))] 
public class CustomRequest : ISerializable 
{ 
    readonly CustomQueryCollection _collection; 
    public CustomRequest(IEnumerable<CustomQuery> queries) 
    { 
     _collection = new CustomQueryCollection(queries); 
    } 
    protected CustomRequest(SerializationInfo info, StreamingContext context) 
    { 
     _collection = (CustomQueryCollection)info.GetValue("Queries", typeof(CustomQueryCollection)); 
    } 
    public CustomQueryCollection Queries { get { return _collection; } } 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Queries", _collection); 
    } 
} 
[ServiceContract] 
public interface ICustomService 
{ 
    [OperationContract] 
    void SendRequest(CustomRequest request); 
} 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class CustomService : ICustomService 
{ 
    public void SendRequest(CustomRequest request) 
    { 
     // this line is never reached. 
    } 
} 
public class CustomClient : ClientBase<ICustomService>, ICustomService 
{ 
    public CustomClient(Binding binding, EndpointAddress address) 
     : base(binding, address) 
    { } 
    public void SendRequest(CustomRequest request) 
    { 
     Channel.SendRequest(request); 
    } 
} 
public partial class ThisAddIn 
{ 
    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     var address = "net.pipe://localhost/kamikaze"; 
     var endpointAddress = new EndpointAddress(address); 
     var binding = new NetNamedPipeBinding(); 
     using (var serviceHost = new ServiceHost(new CustomService())) 
     using (var client = new CustomClient(binding, endpointAddress)) 
     { 
      serviceHost.AddServiceEndpoint(typeof(ICustomService), binding, address); 
      serviceHost.Open(); 
      client.SendRequest(new CustomRequest(new CustomQuery[0])); 
      // this line is never reached. 
      serivceHost.Close(); 
     } 
    } 
    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } 
    #region VSTO generated code 
    private void InternalStartup() 
    { 
     this.Startup += new System.EventHandler(ThisAddIn_Startup); 
     this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
    } 
    #endregion 
} 

Hit [F5]: Word 2007 démarre, puis disparaît, laissant le message du journal décrit ci-dessus dans votre journal d'application du système. Le même code fonctionne parfaitement dans tous les autres contextes que nous avons essayés.

Répondre

0

Modifier ces lignes de code:

[KnownType(typeof(CustomQueryCollection))] 
[KnownType(typeof(CustomQuery[]))] 

_collection = (CustomQueryCollection)info.GetValue("Queries", typeof(CustomQueryCollection)); 
_collection = new CustomQueryCollection((CustomQuery[]) info.GetValue("Queries", typeof(CustomQuery[]))); 

info.AddValue("Queries", _collection); 
info.AddValue("Queries", _collection.ToArray()); 

... là. Plus d'erreurs d'exécution fatales du moteur. Je suppose que cela est lié au fait que Office soit un hôte .Net 2.0, alors que tous nos autres cas d'utilisation et tests impliquaient des hôtes .Net 3.5, mais je ne fais que deviner.