質問

私は最近、いくつかのエラーレポートを取得してきたが、私は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ビットであり、プラットフォームに依存しません。これらの代わりのいずれかを使用するコードを変更し、問題が消えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top