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