In the recent days, each time that I clicked the New Project button of the Visual Studio 2012 IDE, I got this exception:
“Set property ‘System.Windows.ResourceDictionary.DeferrableContent’ threw an exception.”
I have been clueless about this problem until today. When a problem happens in Visual Studio, the recommended approach is to launch it in “Safe mode”, because maybe an extension (add-in, package, etc.) is causing it. As a previous step, what I did today is to take a look at the Add-In Manager and I noticed that I had an add-in (a test runner that I created to perform integration tests of my MZ-Tools add-in) marked to load on startup. I unmarked it and then the problem disappeared. Why was this add-in causing this problem?
After some isolation, it happened that this add-in was setting an event handler for the AppDomain.AssemblyResolve event (to locate required assemblies) and a silenced NullReferenceException was happening in the event handler. The following minimal add-in reproduces the issue:
public class Connect : IDTExtensibility2 { private DTE2 _applicationObject; private AddIn _addInInstance; private AppDomain _appDomain; public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; switch (connectMode) { case ext_ConnectMode.ext_cm_Startup: // OnStartupComplete will be called break; case ext_ConnectMode.ext_cm_AfterStartup: InitializeAddIn(); break; } } public void OnStartupComplete(ref Array custom) { InitializeAddIn(); } private void InitializeAddIn() { _appDomain = AppDomain.CurrentDomain; _appDomain.AssemblyResolve += AppDomain_AssemblyResolve; } public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { _appDomain.AssemblyResolve -= AppDomain_AssemblyResolve; } public void OnAddInsUpdate(ref Array custom) { } public void OnBeginShutdown(ref Array custom) { } private Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Assembly objAssembly = null; AssemblyName objAssemblyName = null; // Force a NullReferenceException if (objAssemblyName.Name == "") { } return objAssembly; } }