WIX 不会将 DLL 复制到 system32 文件夹中
WIX won't copy DLL into system32 folder
我需要将一个 DLL 复制到 system32
文件夹中,那是我的 WIX 脚本,但它不起作用,复制命令失败了:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="LMBrick Service" Language="1033" Version="1.3.0.0"
Manufacturer="MyCompany" UpgradeCode="3de1a175-3701-435f-90bc-e97cb66b5524">
<Package InstallerVersion="200" Compressed="yes" InstallPrivileges="elevated" AdminImage="yes" InstallScope="perMachine" Platform="x64" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Media Id="1" Cabinet="cab1.cab" EmbedCab="yes" />
<Feature Id="ProductFeature" Title="LMBrickServiceInstallation" Level="1">
<ComponentGroupRef Id="LMBrickComponents" />
</Feature>
<CustomAction Id="InstallLMBrickDll" Directory="LMBRICKINSTALLFOLDER" Execute="deferred" Impersonate="no"
ExeCommand="copy LMBrick.dll [System64Folder]LMBrick.dll"
Return="check" />
<InstallExecuteSequence>
<Custom Action="InstallLMBrickDll" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="Company" Name="MyCompany">
<Directory Id="App" Name="MyProduct">
<Directory Id="LMBRICKINSTALLFOLDER" Name="LMBrickService">
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
</Fragment>
</Wix>
运行 Exes 必须执行的自定义操作实际上 运行 一个 exe。但是 copy 不是 exe;它内置于命令 shell 中。所以你有两个直接的选择(后面还有两个更好的选择):
- 找到一个实际的 exe,例如 xcopy.exe 和 运行,或者
- 执行一个shell,例如cmd.exe,参数调用它的copy内置函数。
您可以通过打开命令提示符并分别执行命令 where copy 和 where xcopy 来确认这一点。请注意,以 Exe 形式启动 cmd.exe 或任何控制台程序将导致控制台 window 在安装过程中闪烁。这通常看起来很不专业,您应该使用以下两种选择之一:
- WixQuietExec 等包装器可以抑制控制台 window,或
- 内置 Windows 安装程序功能,例如通过 CopyFile 公开,可以完全避免自定义操作的需要。
如果可能,最好避免自定义操作并使用 Windows 安装程序功能。因此,如果可以的话,请瞄准最后一个选项。
我需要将一个 DLL 复制到 system32
文件夹中,那是我的 WIX 脚本,但它不起作用,复制命令失败了:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="LMBrick Service" Language="1033" Version="1.3.0.0"
Manufacturer="MyCompany" UpgradeCode="3de1a175-3701-435f-90bc-e97cb66b5524">
<Package InstallerVersion="200" Compressed="yes" InstallPrivileges="elevated" AdminImage="yes" InstallScope="perMachine" Platform="x64" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Media Id="1" Cabinet="cab1.cab" EmbedCab="yes" />
<Feature Id="ProductFeature" Title="LMBrickServiceInstallation" Level="1">
<ComponentGroupRef Id="LMBrickComponents" />
</Feature>
<CustomAction Id="InstallLMBrickDll" Directory="LMBRICKINSTALLFOLDER" Execute="deferred" Impersonate="no"
ExeCommand="copy LMBrick.dll [System64Folder]LMBrick.dll"
Return="check" />
<InstallExecuteSequence>
<Custom Action="InstallLMBrickDll" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="Company" Name="MyCompany">
<Directory Id="App" Name="MyProduct">
<Directory Id="LMBRICKINSTALLFOLDER" Name="LMBrickService">
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
</Fragment>
</Wix>
运行 Exes 必须执行的自定义操作实际上 运行 一个 exe。但是 copy 不是 exe;它内置于命令 shell 中。所以你有两个直接的选择(后面还有两个更好的选择):
- 找到一个实际的 exe,例如 xcopy.exe 和 运行,或者
- 执行一个shell,例如cmd.exe,参数调用它的copy内置函数。
您可以通过打开命令提示符并分别执行命令 where copy 和 where xcopy 来确认这一点。请注意,以 Exe 形式启动 cmd.exe 或任何控制台程序将导致控制台 window 在安装过程中闪烁。这通常看起来很不专业,您应该使用以下两种选择之一:
- WixQuietExec 等包装器可以抑制控制台 window,或
- 内置 Windows 安装程序功能,例如通过 CopyFile 公开,可以完全避免自定义操作的需要。
如果可能,最好避免自定义操作并使用 Windows 安装程序功能。因此,如果可以的话,请瞄准最后一个选项。