It took some time to solve this and the conclusions are interesting.
Our Office (Word/Excel/PowerPoint) add-in sends a request to our custom WCF service, the hosting Office application terminates, leaving this entry in the application log:
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)
To reproduce this, create a new "Word 2007 Add-in" project in Visual Studio 2008. Add references to System.ServiceModel and System.Runtime.Serialization. Modify your ThisAddin class to contain this code, which I believe is the minimum code necessary to reproduce this behaviour:
[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 starts, and then disappears, leaving the log message described above in your system's application log. The same code works perfectly fine in all other contexts that we've tried.
Change these lines of 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());
...there. No more fatal engine execution errors. I suspect this is related to Office being a .Net 2.0 host, while all our other use cases and tests involved .Net 3.5 hosts, but I'm only guessing.