【问题标题】:IntPtr.ToInt32() Marshal.ThrowExceptionForHR() - Querying the GACIntPtr.ToInt32() Marshal.ThrowExceptionForHR() - 查询 GAC
【发布时间】:2010-12-09 17:01:29
【问题描述】:

我一直在使用我在网上找到的一些代码来使用 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,所以我有点不知道该怎么做。目前我只是在处理异常,但我想知道正确的处理方法是什么?

马龙

【问题讨论】:

  • 您的测试也是错误的,如果值

标签: c# .net interop gac fusion


【解决方案1】:

检查DllImport 上的CreateAssemblyCache 签名。看起来应该是int,而不是IntPtr

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

【讨论】:

  • 谢谢,我刚刚检查了 Create 和 Query 方法的定义,并且您的正确方法都返回整数。
【解决方案2】:

您为什么使用IntPtr 来保存 HRESULT 的值? HRESULT 的大小与平台无关,它始终为 32 位,因此您应该使用 intuint 来保存该值。将代码更改为使用其中之一,问题就会消失。

【讨论】:

  • assemblyCache.QueryAssemblyInfo() 返回一个 IntPtr。我的基本类型知识很生疏,如果我将其转换为 uInt 是否意味着我将拥有两倍的范围(正数)并且不会溢出? -- 刚试过,不幸的是 Marshal 方法需要一个 Int32
  • @Marlon - 这就是我的观点;它不应该是因为这是代表 HRESULT 的错误类型。您应该更改它以使其正确。
  • 对不起,今天很晚了-我可以更改接口以返回一个 int32,这很好。但这不会仍然溢出,因为我正在与之交互的 COM 对象正在返回 int32 无法存储的东西。
  • 这些方法的结果值是HRESULT,是32位的值。它们可以毫无问题地存储在 32 位整数(int 或 uint)中。
  • 刚刚检查了 msdn 文档,它确实返回了一个 int,不知道为什么它会返回一个大于 int 可以处理的值,但我想我很快就会知道它是否仍然存在'不工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多