【发布时间】:2019-10-17 11:55:04
【问题描述】:
我正在开发一个在自定义操作中创建 SymbolicLink 的 Wix 安装程序。自定义操作是用 C# 编写的。它通过调用CreateSymbolicLink Win32 API 创建 SymbolicLink。在 Windows 10 上,通话效果很好。在 Windows 7 上它失败了。如果我调用 Marshal.GetLastWin32Error(),它会返回错误代码 997,即ERROR_IO_PENDING
这是调用 API 的代码行:
var result = CreateSymbolicLink(pathToCreateLink, installDir, SymbolicLinkFlags.Directory | SymbolicLinkFlags.UnprivilegedCreate);
if(!result)
{
_logger.Log($"Win32 Error Code: {Marshal.GetLastWin32Error()}");
}
这里是 Dll 导入:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CreateSymbolicLink( string lpSymlinkFileName, string pTargetFileName, SymbolicLinkFlags dwFlags);
调用自定义操作时将 Execute 设置为“deferred”并将 Impersonate 设置为“no”。
如果我将这行 C# 代码放在控制台应用程序中,它会正常运行(即使在 Windows 7 上)。所以有一些关于如何在安装程序中调用导致错误的代码。
我的部分问题是我可以找到关于错误代码的信息非常少,所以我不确定要尝试修复它。
【问题讨论】:
-
这听起来很吓人。如果出现这样的错误,我会放弃符号链接方法——尤其是在部署范围很大的情况下。它闻起来像是系统深处的某种东西,或者是您的 Windows 7 机器上存在的某种特殊情况。您是否在多个 Windows 7 机器上进行了测试?
-
我们甚至不知道,那 是 你得到的错误代码。您可能在错误的时间调用
Marshal.GetLastWin32Error(),或者您的P/Invoke 声明未将SetLastError属性设置为true。我们都不知道。投票结束。 -
如果您正在使用(例如)不适用于系统帐户的面向用户的文件夹值,说明您从何处获取实际值也可能很有用。