属性参数必须是一个恒定的表达式,在C#中是否有解决方案?
题
我正在研究涉及使用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。
不隶属于 StackOverflow