COMException occurs when you create a WeakReference object in a .NET Framework-based application
This article helps you work around the COMException
exception that occurs when you create a WeakReference object in an Microsoft .NET Framework-based application.
Original product version: Microsoft .NET Framework 4.5
Original KB number: 2978463
Symptoms
Assume that you develop a .NET Framework-based application. In this application, you use the reflection API to enumerate methods in a WeakReference<T>
type. Then you call the GetFunctionPointer
method on the RuntimeMethodHandle
handle for the WeakReference<T>.Create
function. When the pointer to the WeakReference<T>.Create
method is retrieved by using code that resembles the following code sample:
var assembly = System.Reflection.Assembly.GetAssembly(typeof(WeakReference<object>));
foreach (Type t in assembly.GetTypes())
{
if (t.Name.StartsWith("WeakReference") && t.IsGenericType)
{
MethodInfo[] methods = t.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance);
foreach (MethodInfo method in methods)
{
if (method.Name != "Create")
continue;
var ptr = method.MethodHandle.GetFunctionPointer();
}
}
}
In this situation, a COMException
is raised if you create a WeakReference<T>
object that resembles the following code sample:
WeakReference<object> wr = new WeakReference<object>(new object());
If a debugger is attached to this application's process, you receive an exception and call stack that resembles the following code sample:
Exception object: 0000000102b7bde8
Exception type: System.Runtime.InteropServices.COMException
Message: Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 8000400500 0081eb80 742d5ddf KERNELBASE!RaiseException+0x48
01 0081ec20 743eff3f clr!RaiseTheExceptionInternalOnly+0x27f
02 0081ec50 7445a27f clr!UnwindAndContinueRethrowHelperAfterCatch+0x90
03 0081ecb4 74132b0c clr!PreStubWorker+0x162
04 0081ece4 73a0fd37 clr!ThePreStub+0x16
05 0081ed08 0483039f mscorlib_ni!System.WeakReference1[[System.__Canon, mscorlib]]..ctor(System.__Canon)+0x7
Workaround
To work around this issue, don't retrieve a pointer to the WeakReference<T>.Create
method. This method is private to the WeakReference<T>
class. So, invoking this method may cause undefined behavior even if you get a pointer to the function.