Аргумент атрибута должен быть константным выражением. Есть ли способ обойти это в C #? - PullRequest
1 голос
/ 23 февраля 2010

Я работаю над кодом (WinForms C # NET 3.5), который включает использование unrar.

    [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-битной битах, я хотел назначить UNRAR64.DLL или UNRAR.DLL через строку unrarDll в зависимости от проверки на разрядность системы.

    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

Есть ли простой способ обойти это? Каков будет правильный способ сделать это?

Ответы [ 2 ]

7 голосов
/ 23 февраля 2010

нет :-) это часть спецификации ... вам придется иметь две отдельные сборки для каждой платформы (x86 / x64). Что вы можете сделать, это просто определить директиву препроцессора, а затем сделать что-то вроде

#if x64
// ... define all x64 imports here
#else
// ... define all x86 imports here
#endif
4 голосов
/ 23 февраля 2010

Создайте интерфейс для импорта unrar и реализуйте 32-битные и 64-битные версии отдельно. Если 32-битный, создать экземпляр 32-битного Impl, иначе создать 64-битный Impl.

...