Pergunta

Eu tenho usado algum código que encontrei na rede para consultar o GAC usando o Fusion.dll, no entanto, recentemente recebi alguns relatórios de erro reclamando de uma oflowException.

    // 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;
    }

O código ofensivo é quando está tentando converter o INTPTR em um INT32 quando é realmente um Int64, mas o problema é o marechal.THOWExceptionforhr apenas aceita um INT32, por isso estou um pouco preso pelo que fazer. No momento, estou apenas lidando com a exceção, mas gostaria de saber qual é a maneira correta de fazê -lo?

Marlon

Foi útil?

Solução

Verifique a assinatura em seu DllImport por CreateAssemblyCache. Parece que deveria ser int, não IntPtr

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

Outras dicas

Por que você está usando um IntPtr Para manter o valor de um HRESULT? O tamanho de um HRESULT não depende da plataforma, é sempre 32 bits, então você deve usar int ou uint Para manter o valor. Altere o código para usar um deles, e o problema desaparecerá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top