我正在研究一个涉及使用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);
Run Code Online (Sandbox Code Playgroud)
由于我希望代码在32BIT和64BIT上工作,我想通过字符串unrarDll分配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);
}
Run Code Online (Sandbox Code Playgroud)
抛出错误:
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
Run Code Online (Sandbox Code Playgroud)