属性参数必须是一个恒定的表达式,在C#中是否有解决方案?

StackOverflow https://stackoverflow.com/questions/2321103

  •  22-09-2019
  •  | 
  •  

我正在研究涉及使用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位上都使用,因此我想通过字符串外抛出andrardll分配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

有什么简单的方法吗?这样做的正确方法是什么?

有帮助吗?

解决方案

否:-)这是规格的一部分...您必须为每个平台(x86/x64)拥有两个单独的构建。您能做的就是简单地定义预处理器指令,然后做类似的事情

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

其他提示

创建一个为统计局导入的接口,并分别实现32位和64位版本。如果32位,请实例化32位inment,否则实例化64位inmand。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top