Compartilhar via


Exceção COM ao criar um objeto WeakReference em um aplicativo do .NET Framework

Este artigo ajuda você a contornar a COMException exceção que ocorre quando você cria um objeto WeakReference em um aplicativo baseado no Microsoft .NET Framework.

Aplica-se a: Microsoft .NET Framework 4.5

Número original da base de conhecimento: 2978463

Sintomas

Suponha que você desenvolva um aplicativo baseado em .NET Framework. Neste aplicativo, você usa a API de reflexão para enumerar métodos em um WeakReference<T> tipo. Em seguida, você chama o método GetFunctionPointer no identificador RuntimeMethodHandle da função WeakReference<T>.Create. O código que se assemelha ao exemplo de código a seguir recupera o ponteiro para o método WeakReference<T>.Create:

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

Nessa situação, a COMException é gerado se você criar um WeakReference<T> objeto semelhante ao seguinte exemplo de código:

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

Se um depurador estiver anexado ao processo do aplicativo, você receberá uma exceção e uma pilha de chamadas semelhantes ao exemplo de código a seguir:

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

Solução

Para contornar esse problema, não recupere um ponteiro para o WeakReference<T>.Create método. Este é um método privado da WeakReference<T> classe. Portanto, invocar esse método pode causar um comportamento indefinido mesmo que você obtenha um ponteiro para a função.