COMException tritt auf, wenn Sie ein WeakReference-Objekt in einer .NET Framework-basierten Anwendung erstellen

Dieser Artikel hilft Ihnen beim Umgehen der COMException Ausnahme, die auftritt, wenn Sie ein WeakReference-Objekt in einer Microsoft .NET Framework-basierten Anwendung erstellen.

Ursprüngliche Produktversion:   Microsoft .NET Framework 4.5
Ursprüngliche KB-Nummer:   2978463

Problembeschreibung

Angenommen, Sie entwickeln eine .NET Framework-basierte Anwendung. In dieser Anwendung verwenden Sie die Reflektions-API zum Aufzählen von Methoden in einem WeakReference<T> Typ. Anschließend rufen Sie die GetFunctionPointer Methode für das Handle für die Funktion RuntimeMethodHandle WeakReference<T>.Create auf. Wenn der Zeiger auf die WeakReference<T>.Create Methode mithilfe von Code abgerufen wird, der dem folgenden Codebeispiel ähnelt:

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 diesem Fall wird eine COMException ausgelöst, wenn Sie ein WeakReference<T> Objekt erstellen, das dem folgenden Codebeispiel ähnelt:

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

Wenn ein Debugger an den Prozess dieser Anwendung angefügt ist, erhalten Sie eine Ausnahme und einen Aufrufstapel, der dem folgenden Codebeispiel ähnelt:

Exception-Objekt: 0000000102b7bde8
Ausnahmetyp: System.Runtime.InteropServices.COMException
Meldung: Nicht angegebener Fehler (Ausnahme von HRESULT: 0x80004005 (E_FAIL))
Innerexception: <none>
StackTrace (generiert):
<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

Problemumgehung

Um dieses Problem zu umgehen, rufen Sie keinen Zeiger auf die WeakReference<T>.Create Methode ab. Diese Methode ist für die WeakReference<T> Klasse privat. Das Aufrufen dieser Methode kann also auch dann zu einem nicht definierten Verhalten führen, wenn Sie einen Zeiger auf die Funktion abrufen.