Frage

Ich habe einige Code benutze ich im Netz gefunden habe, die GAC abzufragen, um die fusion.dll Verwendung jedoch habe ich vor kurzem ein paar Fehlermeldungen wurde immer von einem Overflowrück beschweren.

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

Der säumige Code ist, wenn sein Versuch, den IntPtr zu einem Int32, wenn sein eigentlich ein Int64 zu konvertieren, aber das Problem ist die Marshal.ThrowExceptionForHR nur ein Int32 akzeptiert, damit ich ein bisschen bin stecken, was zu tun ist. Im Moment bin ich Umgang nur die Ausnahme, aber ich möchte wissen, was der richtige Weg ist, es zu tun?

Marlon

War es hilfreich?

Lösung

Überprüfen Sie die Unterschrift auf dem DllImport für CreateAssemblyCache. Es sieht aus wie sollte es int sein, nicht IntPtr

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

Andere Tipps

Warum verwenden Sie einen IntPtr den Wert eines HRESULT zu halten? Die Größe eines HRESULT ist nicht plattformabhängig, es ist immer 32 Bit, so dass Sie entweder int oder uint verwenden sollten, um den Wert zu halten. Ändern Sie den Code eines dieser stattdessen zu verwenden, und das Problem weggeht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top