2

ネット上で見つけたコードを使用して、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であるときにIntPtrをInt32に変換しようとしている場合ですが、問題はMarshal.ThrowExceptionForHRがInt32のみを受け入れるため、何をすべきかについて少し行き詰まっています。現時点では例外を処理しているだけですが、それを行う正しい方法を知りたいのですが。

マーロン

4

2 に答える 2

5

の署名を確認してDllImportくださいCreateAssemblyCache。あるべきでintはないようですIntPtr

[DllImport("fusion.dll")]
internal static extern int CreateAssemblyCache(
    out IAssemblyCache ppAsmCache, int reserved);
于 2010-12-09T17:08:26.247 に答える
4

IntPtrHRESULTの値を保持するためにを使用しているのはなぜですか?HRESULTのサイズはプラットフォームに依存せず、常に32ビットであるため、またはのいずれintかを使用uintして値を保持する必要があります。代わりにこれらのいずれかを使用するようにコードを変更すると、問題は解決します。

于 2010-12-09T17:06:37.487 に答える