COMException se produit lorsque vous créez un objet WeakReference dans une application .NET Framework

Cet article vous aide à contourner l' COMException exception qui se produit lorsque vous créez un objet WeakReference dans une application Microsoft .NET Framework.

Version du produit d’origine :   Microsoft .NET Framework 4,5
Numéro de la base de connaissances initiale :   2978463

Symptômes

Supposons que vous développiez une application .NET Framework. Dans cette application, vous utilisez l’API de réflexion pour énumérer les méthodes dans un WeakReference<T> type. Ensuite, appelez la GetFunctionPointer méthode sur le RuntimeMethodHandle handle de la WeakReference<T>.Create fonction. Lorsque le pointeur de la WeakReference<T>.Create méthode est récupéré à l’aide d’un code semblable à l’exemple de code suivant :

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

Dans ce cas, un COMException est déclenché si vous créez un WeakReference<T> objet ressemblant à l’exemple de code suivant :

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

Si un débogueur est attaché au processus de cette application, vous recevez une exception et une pile d’appels ressemblant à l’exemple de code suivant :

Exception, objet : 0000000102b7bde8
Type d’exception : System. Runtime. InteropServices. COMException
Message : erreur non spécifiée (exception à partir de HRESULT : 0x80004005 (E_FAIL))
P :System.exception.InnerException<none>
StackTrace (généré) :
<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

Solution de contournement

Pour contourner ce problème, ne récupérez pas de pointeur vers la WeakReference<T>.Create méthode. Cette méthode est privée pour la WeakReference<T> classe. Par conséquent, l’appel de cette méthode peut entraîner un comportement indéfini même si vous obtenez un pointeur vers la fonction.