【问题标题】:Wix Custom Action fails to create SymbolicLink on Windows 7Wix 自定义操作无法在 Windows 7 上创建 SymbolicLink
【发布时间】: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。我们都不知道。投票结束。
  • 如果您正在使用(例如)不适用于系统帐户的面向用户的文件夹值,说明您从何处获取实际值也可能很有用。

标签: winapi wix


【解决方案1】:

可以在 wixsharp 代码中找到一种确认。他们遇到了这个问题,无法超越。 https://github.com/oleg-shilo/wixsharp/blob/master/Source/src/WixSharp/ResilientPackage.cs

我在安装程序中实现的 w/a 是通过 cmd 工具 mklink 重复创建符号链接,如果它也失败了,只需复制文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多