Я работаю над кодом (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 есть простой способ обойти это? Каким будет правильный способ сделать это?
Атрибуты производят метаданные в сборках. Было бы трудно сделать это с непостоянными выражениями. –