2010-02-23 5 views
1

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

[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); 

Поскольку я хочу, чтобы код, который будет работать как на 32bit и 64bit я хотел назначить 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

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

+0

Атрибуты производят метаданные в сборках. Было бы трудно сделать это с непостоянными выражениями. –

ответ

7

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

#if x64 
// ... define all x64 imports here 
#else 
// ... define all x86 imports here 
#endif 
+0

Он отлично работает для 7zip, просто unrar не позволяет установить способ 7zip. – MadBoy

+0

В стороне, DllImport действительно приближается к этому, с полем CharSet, в котором он будет правильно вызывать версию метода API A или W в зависимости от того, является ли она ASCII или Unicode системой, - но эти методы должны быть в той же DLL. Слишком плохо, что он не может сделать что-то подобное в разных DLL. – Nick

4

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

+0

Это мой предпочтительный вариант. Легко иметь две версии интерфейса, плюс, вы получаете хороший управляемый интерфейс для работы с этим способом ... –

+0

Можете ли вы показать пример, как это могло бы выглядеть? – MadBoy

 Смежные вопросы

  • Нет связанных вопросов^_^