IntPtr.ToInt32 () Marshal.ThrowExceptionForHR () - Запрос GAC - PullRequest
1 голос
/ 09 декабря 2010

Я использовал некоторый код, который нашел в сети, для запроса 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.ThrowExceptionForHR принимает только Int32, поэтому я немного застрял в том, что делать. В данный момент я просто обрабатываю исключение, но я хотел бы знать, как правильно это сделать?

Marlon

Ответы [ 2 ]

4 голосов
/ 09 декабря 2010

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

[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
    out IAssemblyCache ppAsmCache, int reserved);
4 голосов
/ 09 декабря 2010

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

...