IntPtr.ToInt32 () Marshal.ThrowExceptionForHR () - Interrogation du GAC
Question
J'utilise un code que j'ai trouvé sur le net pour interroger le GAC en utilisant la fusion.dll mais j'ai récemment été faire quelques rapports d'erreur se plaignant d'un retour 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;
}
Le code incriminé est lorsque son essayant de convertir le IntPtr à un Int32 lorsque sa fait un Int64, mais le problème est le Marshal.ThrowExceptionForHR accepte que Int32 donc je suis un peu coincé pour ce faire. En ce moment je me occupe juste l'exception mais je voudrais savoir quelle est la bonne façon de le faire?
Marlon
La solution
Vérifiez la signature de votre DllImport
pour CreateAssemblyCache
. On dirait qu'il devrait être int
, pas IntPtr
[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
out IAssemblyCache ppAsmCache, int reserved);
Autres conseils
Pourquoi utilisez-vous un IntPtr
pour maintenir la valeur d'un HRESULT? La taille d'un HRESULT ne dépend pas de la plate-forme, il est toujours 32 bits, vous devez donc utiliser soit int
ou uint
pour maintenir la valeur. Modifiez le code à utiliser l'un de ces à la place, et le problème disparaîtra.