2

unrarの使用を含むコード(WinForms C#NET 3.5)に取り組んでいます。

    [DllImport("UNRAR64.DLL")]
    private static extern IntPtr RAROpenArchive(ref RAROpenArchiveData archiveData);
    [DllImport("UNRAR64.DLL")]
    private static extern IntPtr RAROpenArchiveEx(ref RAROpenArchiveDataEx archiveData);
    [DllImport("UNRAR64.DLL")]
    private static extern int RARCloseArchive(IntPtr hArcData);
    [DllImport("UNRAR64.DLL")]
    private static extern int RARReadHeader(IntPtr hArcData, ref RARHeaderData headerData);
    [DllImport("UNRAR64.DLL")]
    private static extern int RARReadHeaderEx(IntPtr hArcData, ref RARHeaderDataEx headerData);
    [DllImport("UNRAR64.DLL")]
    private static extern int RARProcessFile(IntPtr hArcData, int operation, [MarshalAs(UnmanagedType.LPStr)] string destPath, [MarshalAs(UnmanagedType.LPStr)] string destName);
    [DllImport("UNRAR64.DLL")]
    private static extern void RARSetCallback(IntPtr hArcData, UNRARCallback callback, int userData);
    [DllImport("UNRAR64.DLL")]
    private static extern void RARSetPassword(IntPtr hArcData, [MarshalAs(UnmanagedType.LPStr)] string password);

コードを32ビットと64ビットの両方で機能させたいので、システムのビット数のチェックに応じて、文字列unrarDllを介してUNRAR64.DLLまたはUNRAR.DLLを割り当てたいと思いました。

    private void DllChoice() {
        if (SystemIs64Bit()) {
            sevenZipDll = "7z-x64.dll";
            unrarDll = "unrar.dll";
        } else {
            sevenZipDll = "7x-x32.dll";
            unrarDll = "unrar64.dll";
        }
    } 
    private static bool SystemIs64Bit() {
        return (IntPtr.Size == 8);
    }

エラーがスローされます:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

これを回避する簡単な方法はありますか?これを行う適切な方法は何でしょうか?

4

2 に答える 2

7

いいえ:-)これは仕様の一部です...プラットフォームごとに2つの別々のビルド(x86 / x64)が必要になります。できることは、プリプロセッサディレクティブを定義してから、次のようなことを行うことです。

#if x64
// ... define all x64 imports here
#else
// ... define all x86 imports here
#endif
于 2010-02-23T19:37:10.083 に答える
4

unrarインポート用のインターフェイスを作成し、32ビットバージョンと64ビットバージョンを別々に実装します。32ビットの場合は32ビットのimplをインスタンス化し、そうでない場合は64ビットのimplをインスタンス化します。

于 2010-02-23T19:40:50.500 に答える