Question

J'utilise un code que j'ai trouvé sur le net pour interroger le GAC en utilisant la fusion.dll mais j'ai récemment été faire quelques rapports d'erreur se plaignant d'un retour 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;
    }

Le code incriminé est lorsque son essayant de convertir le IntPtr à un Int32 lorsque sa fait un Int64, mais le problème est le Marshal.ThrowExceptionForHR accepte que Int32 donc je suis un peu coincé pour ce faire. En ce moment je me occupe juste l'exception mais je voudrais savoir quelle est la bonne façon de le faire?

Marlon

Était-ce utile?

La solution

Vérifiez la signature de votre DllImport pour CreateAssemblyCache. On dirait qu'il devrait être int, pas IntPtr

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

Autres conseils

Pourquoi utilisez-vous un IntPtr pour maintenir la valeur d'un HRESULT? La taille d'un HRESULT ne dépend pas de la plate-forme, il est toujours 32 bits, vous devez donc utiliser soit int ou uint pour maintenir la valeur. Modifiez le code à utiliser l'un de ces à la place, et le problème disparaîtra.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top