IntPtr.ToInt32 () Marshal.ThrowExceptionForHR () - Bevraagteken die GAC
Vra
Ek het al met behulp van 'n paar kode Ek het gevind op die net om die GAC navraag met behulp van die fusion.dll maar ek het onlangs om 'n paar fout terugvoer kla van 'n 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;
}
Die oortredende kode is wanneer sy probeer om die IntPtr te skakel na 'n int32 toe sy eintlik 'n Int64, maar die probleem is die Marshal.ThrowExceptionForHR net aanvaar 'n int32 so ek is 'n bietjie vas vir wat om te doen. Op die oomblik is ek net die hantering van die uitsondering, maar ek wil graag weet wat is die regte manier om dit te doen?
Marlon
Oplossing
Gaan die handtekening op jou DllImport
vir CreateAssemblyCache
. Dit lyk asof dit int
moet wees, nie IntPtr
[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
out IAssemblyCache ppAsmCache, int reserved);
Ander wenke
Hoekom gebruik jy 'n IntPtr
om die waarde van 'n HRESULT hou? Die grootte van 'n HRESULT is nie platform afhanklik is, is dit altyd 32 stukkies, sodat jy óf int
of uint
moet gebruik om die waarde te hou. Verander die kode na een van hierdie plaas gebruik, en die probleem sal weggaan.