Вопрос

Я использовал какой-то код, который я нашел в сети, чтобы запросить GAC, используя Fusion.dll, однако, что я недавно получал несколько сообщений об ошибках, жалуясь на 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;
    }

Запусковая кода - это когда он пытается преобразовать IntPTR в INT32, когда его на самом деле INT64, но проблема в Marshal.throwExceptionForhRHROR принимает только int32, поэтому я немного застрял в том, что делать. На данный момент я просто обрабатываю исключение, но я хотел бы знать, какой правильный способ сделать это?

Марлон

Это было полезно?

Решение

Проверьте подпись на вашем DllImport для CreateAssemblyCache. Отказ Похоже, это должно быть int, нет IntPtr

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

Другие советы

Почему вы используете IntPtr Удерживать ценность HResult? Размер HResult не зависит от платформы, это всегда 32 бита, поэтому вы должны использовать либо int или uint держать значение. Измените код, чтобы использовать один из них вместо этого, и проблема уйдет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top