COMException se produce cuando se crea un objeto WeakReference en una .NET Framework basada en aplicaciones

Este artículo le ayuda a evitar la excepción que se produce al crear un objeto WeakReference en una aplicación COMException basada .NET Framework Microsoft.

Versión del producto original:   Microsoft .NET Framework 4.5
Número KB original:   2978463

Síntomas

Suponga que desarrolla una aplicación .NET Framework basada en aplicaciones. En esta aplicación, se usa la API de reflejo para enumerar los métodos de un WeakReference<T> tipo. A continuación, GetFunctionPointer se llama al método en el identificador de la RuntimeMethodHandle WeakReference<T>.Create función. Cuando se recupera el puntero al método mediante código similar al WeakReference<T>.Create ejemplo de código siguiente:

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();
        }
    }
}

En esta situación, se genera una si COMException se crea un objeto similar al siguiente ejemplo de WeakReference<T> código:

WeakReference<object> wr = new WeakReference<object>(new object());

Si se adjunta un depurador al proceso de esta aplicación, recibirá una excepción y una pila de llamadas similar al ejemplo de código siguiente:

Objeto Exception: 0000000102b7bde8
Tipo de excepción: System.Runtime.InteropServices.COMException
Mensaje: Error no especificado (Excepción de HRESULT: 0x80004005 (E_FAIL))
InnerException: <none>
StackTrace (generado):
<none>
StackTraceString: <none>
HResult: 80004005

00 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

Solución alternativa

Para evitar este problema, no recupere un puntero al WeakReference<T>.Create método. Este método es privado para la WeakReference<T> clase. Por lo tanto, invocar este método puede provocar un comportamiento no definido incluso si obtiene un puntero a la función.