2010-12-09 3 views
1

Я использовал код, который я нашел в сети, чтобы запросить GAC с помощью файла fusion.dll, однако я недавно получил несколько ошибок сообщает о жалобах на исключение OverflowException.IntPtr.ToInt32() Marshal.ThrowExceptionForHR() - Запрос GAC

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

+0

Ваш тест тоже неправильно, HRESULT только код ошибки, если значение <0. – 2010-12-09 18:04:47

ответ

4

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

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

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

+0

assemblyCache.QueryAssemblyInfo() возвращает IntPtr. Мое базовое знание типа - это ржавый, если я конвертирую его в uInt, это означает, что у меня будет двойной диапазон (положительный), и он не будет переполняться? - Просто попробовал, к сожалению, метод маршала ожидает Int32 – Marlon 2010-12-09 17:12:06

+0

@Marlon - это моя точка; это не должно, потому что это неправильный тип для представления HRESULT. Вы должны изменить его, чтобы оно было правильным. – 2010-12-09 17:13:49