Pregunta

He estado usando algún código que he encontrado en la red para consultar el GAC utilizando el fusion.dll sin embargo, recientemente he estado recibiendo unos pocos informes de error de vuelta a quejarse de un OverflowException.

    // If assemblyName is not fully qualified, a random matching may be returned!!!!
    public static String QueryAssemblyInfo(String assemblyName)
    {
        ASSEMBLY_INFO assembyInfo = new ASSEMBLY_INFO();
        assembyInfo.cchBuf = 512;
        assembyInfo.currentAssemblyPath = new String('\0',
        assembyInfo.cchBuf);
        IAssemblyCache assemblyCache = null;
        // Get IAssemblyCache pointer
        IntPtr hr = GacApi.CreateAssemblyCache(out assemblyCache, 0);
        if (hr == IntPtr.Zero)
        {
            hr = assemblyCache.QueryAssemblyInfo(1, assemblyName, ref assembyInfo);
            if (hr != IntPtr.Zero)
                Marshal.ThrowExceptionForHR(hr.ToInt32());
        }
        else
            Marshal.ThrowExceptionForHR(hr.ToInt32());
        return assembyInfo.currentAssemblyPath;
    }

El código es ofender cuando su tratando de convertir el IntPtr a un Int32 cuando su realidad Int64, pero el problema es la Marshal.ThrowExceptionForHR sólo acepta un Int32, así que estoy un poco atascado para saber qué hacer. Por el momento sólo estoy manejar la excepción pero me gustaría saber cuál es la forma correcta de hacerlo?

Marlon

¿Fue útil?

Solución

Comprobar la firma en su DllImport para CreateAssemblyCache. Parece que debería ser int, no IntPtr

[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
    out IAssemblyCache ppAsmCache, int reserved);

Otros consejos

¿Por qué utiliza un IntPtr para mantener el valor de un HRESULT? El tamaño de un HRESULT no es dependiente de la plataforma, es siempre 32 bits, por lo que debe utilizar int o uint para mantener el valor. Cambiar el código para utilizar uno de estos en su lugar, y el problema desaparecerá.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top