我一直在使用我在网上找到的一些代码来使用fusion.dll查询GAC但是我最近得到了一些错误报告,抱怨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所以我有点卡住了该做什么。目前我只是处理异常,但我想知道这样做的正确方法是什么?
马龙
答案 0 :(得分:4)
为什么使用IntPtr
来保存HRESULT的值? HRESULT的大小与平台无关,它始终为32位,因此您应使用int
或uint
来保存该值。更改代码以使用其中一个代码,问题就会消失。
答案 1 :(得分:4)
检查DllImport
上的签名是否为CreateAssemblyCache
。它看起来应该是int
,而不是IntPtr
[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
out IAssemblyCache ppAsmCache, int reserved);