windows-installer - WiX 工具集自定义操作 - 无法通过 WiX 项目找到 dll 和引用
问题描述
当我的安装程序即将完成时,我正在尝试使用 WiX 工具集的自定义操作注入 SQL 脚本。
产品.wxs,
<CustomAction Id="SetMyActionValues" Return="check" Property="MyAction" Value="dbServer=
[DATABASE_SERVER];dbName=[DATABASE_NAME];dbUser=[DATABASE_USERNAME];dbPass=
[DATABASE_PASSWORD];folderPath=[CREATESCRIPTS]"/>
<Binary Id="MyScripts" SourceFile="C:\Users\User\source\repos\Scripts\Scripts\bin\Scripts.CA.dll" />
<CustomAction Id="MyAction" Return="check" Execute="deferred" BinaryKey="MyScripts" DllEntry="CustomAction1"/>
当我将二进制条目的“FileSource”设置为绝对路径(C:\Users\User\source\repos\Scripts\Scripts\bin\Scripts.CA.dll)时,它编译成功,但给出了一个错误说 dll cannot在安装即将完成时找到。
接下来,我尝试将 Scripts.CA.dll 引用到我的 WiX 项目,并将 FileSource 更改为“Scripts.CA.dll”。这一次,我无法编译项目,Visual Studio 告诉我 Scripts.CA.dll 缺少程序集清单。
我正在使用最新的 WiX 工具集版本,谁能告诉我哪一部分出了问题?
非常感谢。
解决方案
假设您正在使用 c# wix 自定义操作。这个“找不到dll”的问题通常是因为忽略了以下几点 -
您的二进制文件可能不需要自定义操作。自定义操作中使用错误的二进制文件的情况。
您的自定义操作名称可能与自定义操作项目中写入的内容不匹配。此名称区分大小写。
如果 ca.dll 中存在自定义操作方法,请尝试以下命令来识别。
Dumpbin.exe 带有 Visual Studio C++ 开发包。这将列出所有公共自定义操作方法。在 Visual Studio 开发命令提示符中运行。
Dumpbin.exe /exports Sample.ca.dll
- 未为自定义操作提供方法属性。如果你不提供 CustomAction 作为方法属性,它永远不会通过 ca.dll 暴露出来。
[CustomAction] public static ActionResult customActionName(Session session) { //Do Action return ActionResult.Success; }
编辑 2:
我们通常不会给出任何文件的绝对路径,您可以使用 CA 项目参考来获取 ca.dll 的路径。例如。“$(var.CustomActionProjectName.TargetDir)\Scripts.CA.dll”。这里 CustomActionProjectName 是安装程序中为自定义操作引用的项目。该路径可以在 wxi 文件中定义,以便更好地结构化。
安装程序.wxi 文件
<?define customActionDllPath="$(var.CustomActionProjectName.TargetDir)\Scripts.CA.dl" ?>
自定义动作.wxs
<?include "Installer.wxi"?>
<Binary Id="MyScripts" SourceFile="$(var.customActionDllPath)\Scripts.CA.dll" />
推荐阅读
- c# - C# 将文件名作为 json 参数传递 - 出现错误“无法识别的转义序列。”
- bash - sed:删除除最后 n 个字符之外的所有字符
- error-handling - Nifi:发送文件到HDFS;如果失败,请等待一秒钟然后重试
- amazon-web-services - 如何在 CloudFormation 中定义 CloudFront 源组?
- android-studio - 如何修复“android.content.ActivityNotFoundException”android-studio 2.3.3
- unit-testing - 条件覆盖和单元测试
- terraform - 在 Terraform 中将两个列表组合成一个格式化字符串
- php - 无法使用 sylius 服务
- .net-core - 在 .net 核心应用程序中使用 O365 组的代码
- python - 关于django防止同一个账号多次登录的方法