WiX 工具集自定义操作 - 无法通过 WiX 项目找到 dll 和引用
WiX Toolset Custom Action - Unable to find dll and reference through WiX Project
我正在尝试在我的安装程序即将完成时使用 WiX 工具集的自定义操作注入 SQL 脚本。
Product.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
接下来,我尝试将 Scripts.CA.dll 引用到我的 WiX 项目,并将 FileSource 更改为“Scripts.CA.dll”。这一次,我无法编译项目,Visual Studio 告诉我脚本。CA.dll 缺少程序集清单。
我使用的是最新的WiX工具集版本,谁能指出我哪里出了问题?
非常感谢。
假设您使用的是 c# wix 自定义操作。这个'dll not found'的问题一般是因为忽略了以下几点-
您的二进制文件可能不需要自定义操作。自定义操作中使用错误二进制文件的案例。
您的自定义动作名称可能与自定义动作项目中写入的名称不匹配。此名称区分大小写。
如果自定义操作方法存在于 ca.dll 中,请尝试使用以下命令来识别。
Dumpbin.exe 附带 Visual Studio C++ 开发包。
这将列出所有 public 自定义操作方法。 运行 在 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 文件中定义此路径以获得更好的结构。
Installer.wxi 文件
<?define customActionDllPath="$(var.CustomActionProjectName.TargetDir)\Scripts.CA.dl" ?>
CustomAction.wxs
<?include "Installer.wxi"?>
<Binary Id="MyScripts" SourceFile="$(var.customActionDllPath)\Scripts.CA.dll" />
我使用了您的 "Edit 2" 答案并成功编译。我做的步骤:
- 将项目引用添加到我的自定义操作项目。
- 按照您的编辑 2 说明进行操作
- 编译成功
我想我们只是不能直接添加对 Scripts.CA.dll 的引用。谢谢 Ashish!
我正在尝试在我的安装程序即将完成时使用 WiX 工具集的自定义操作注入 SQL 脚本。
Product.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
接下来,我尝试将 Scripts.CA.dll 引用到我的 WiX 项目,并将 FileSource 更改为“Scripts.CA.dll”。这一次,我无法编译项目,Visual Studio 告诉我脚本。CA.dll 缺少程序集清单。
我使用的是最新的WiX工具集版本,谁能指出我哪里出了问题?
非常感谢。
假设您使用的是 c# wix 自定义操作。这个'dll not found'的问题一般是因为忽略了以下几点-
您的二进制文件可能不需要自定义操作。自定义操作中使用错误二进制文件的案例。
您的自定义动作名称可能与自定义动作项目中写入的名称不匹配。此名称区分大小写。
如果自定义操作方法存在于 ca.dll 中,请尝试使用以下命令来识别。
Dumpbin.exe 附带 Visual Studio C++ 开发包。 这将列出所有 public 自定义操作方法。 运行 在 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 文件中定义此路径以获得更好的结构。
Installer.wxi 文件
<?define customActionDllPath="$(var.CustomActionProjectName.TargetDir)\Scripts.CA.dl" ?>
CustomAction.wxs
<?include "Installer.wxi"?>
<Binary Id="MyScripts" SourceFile="$(var.customActionDllPath)\Scripts.CA.dll" />
我使用了您的 "Edit 2" 答案并成功编译。我做的步骤:
- 将项目引用添加到我的自定义操作项目。
- 按照您的编辑 2 说明进行操作
- 编译成功
我想我们只是不能直接添加对 Scripts.CA.dll 的引用。谢谢 Ashish!