I use COM interoperability to create a managed plugin in an unmanaged application using VS2012 / .NET 4.5 / Win8.1. It seems that all the interop files go fine, but when I close the application, I get an MDA exception telling me that AV happened when the COM objects that RCW held during Finalization were released.
This is the call stack:
clr.dll!MdaReportAvOnComRelease::ReportHandledException() + 0x91 bytes clr.dll!**SafeRelease_OnException**() + 0x55 bytes clr.dll!SafeReleasePreemp() + 0x312d5f bytes clr.dll!RCW::ReleaseAllInterfaces() + 0xf3 bytes clr.dll!RCW::ReleaseAllInterfacesCallBack() + 0x4f bytes clr.dll!RCW::Cleanup() + 0x24 bytes clr.dll!RCWCleanupList::ReleaseRCWListRaw() + 0x16 bytes clr.dll!RCWCleanupList::ReleaseRCWListInCorrectCtx() + 0x9c bytes clr.dll!RCWCleanupList::CleanupAllWrappers() + 0x2cd1b6 bytes clr.dll!RCWCache::ReleaseWrappersWorker() + 0x277 bytes clr.dll!AppDomain::ReleaseRCWs() + 0x120cb2 bytes clr.dll!ReleaseRCWsInCaches() + 0x3f bytes clr.dll!InnerCoEEShutDownCOM() + 0x46 bytes clr.dll!WKS::GCHeap::**FinalizerThreadStart**() + 0x229 bytes clr.dll!Thread::intermediateThreadProc() + 0x76 bytes kernel32.dll!BaseThreadInitThunk() + 0xd bytes ntdll.dll!RtlUserThreadStart() + 0x1d bytes
I assume that the application has already destroyed its COM objects, from which some links were passed to the managed plug-in, and the IUnknown :: Release call made by RCW makes it go with an arrow.
In the output window (VS), I clearly see that the application has already begun unloading some of them dlls.
'TestHost.exe': Unloaded 'C:\Windows\System32\msls31.dll' 'TestHost.exe': Unloaded 'C:\Windows\System32\usp10.dll' 'TestHost.exe': Unloaded 'C:\Windows\System32\riched20.dll' 'TestHost.exe': Unloaded 'C:\Windows\System32\version.dll' First-chance exception at 0x00000001400cea84 in VST3PluginTestHost.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff. First-chance exception at 0x00000001400cea84 in VST3PluginTestHost.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff. Managed Debugging Assistant 'ReportAvOnComRelease' has detected a problem in 'C:\Program Files\Steinberg\VST3PluginTestHost\VST3PluginTestHost.exe'. Additional Information: An exception was caught but handled while releasing a COM interface pointer through Marshal.Release or Marshal.ReleaseComObject or implicitly after the corresponding RuntimeCallableWrapper was garbage collected. This is the result of a user refcount error or other problem with a COM object Release. Make sure refcounts are managed properly. The COM interface pointer original vtable pointer was 0x406975a8. While these types of exceptions are caught by the CLR, they can still lead to corruption and data loss so if possible the issue causing the exception should be addressed
So even though I would manage my life and write a ComReference class that calls Marshal.ReleaseComObject. This did not work correctly, and after reading it, I have to agree that calling Marshal.ReleaseComObject in a script where links are passed freely is not a good idea. Marshal .ReleaseComObject considered dangerous
So the question is: is there a way to manage this situation so as not to cause AV when exiting the host application?
c # visual-studio-2012 access-violation com-interop rcw
obiwanjacobi
source share