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: 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
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.