IntPtr.ToInt32()Marshal.ThrowExceptionForHR() - GACの照会
質問
私は最近、いくつかのエラーレポートを取得してきたが、私は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;
}
その際には、その実際のInt64のInt32へのIntPtrを変換しようとすると、怒らコードですが、問題は、私は何をすべきかのために立ち往生ビットてるのでMarshal.ThrowExceptionForHRだけのInt32を受け入れています。現時点では私は例外を処理していますが、私はそれを行うための正しい方法が何であるかを知りたい?
マーロン
解決
DllImport
のためのあなたのCreateAssemblyCache
の署名を確認してください。それはint
する必要がありますように見えます、ないIntPtr
[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
out IAssemblyCache ppAsmCache, int reserved);
他のヒント
なぜあなたはHRESULTの値を保持するためにIntPtr
を使用していますか? HRESULTの大きさは、あなたが値を保持するためにint
またはuint
のいずれかを使用する必要がありますので、それは、常に32ビットであり、プラットフォームに依存しません。これらの代わりのいずれかを使用するコードを変更し、問題が消えます。
所属していません StackOverflow