如何将本机 DLL 包含到 WiX 安装程序的托管 DLL/自定义操作中?
我正在制作一个 WiX/MSI 安装程序,它使用用 C# 编写的自定义操作 DLL。在该自定义操作中,我正在调用本机/非托管 DLL。下面是一个示例:
[DllImport("log.dll",
CharSet = CharSet.Unicode,
SetLastError = true,
CallingConvention = CallingConvention.StdCall)]
static extern int CloseLog(IntPtr hLog);
问题是,当我的 MSI 运行并且调用自定义操作时,对 CloseLog
的调用会引发 DllNotFoundException
异常。
我可以手动将 log.dll
的链接添加到我的自定义操作 C# DLL 项目中:
但问题是无法指定哪个版本log.dll
从 C# 项目使用,即 x86/x64/debug/release。
那么有什么建议如何去做吗?
I'm making a WiX/MSI installer that uses a custom action DLL written in C#. Inside that custom action I'm pinvoking a native/unmanaged DLL. Here's an example:
[DllImport("log.dll",
CharSet = CharSet.Unicode,
SetLastError = true,
CallingConvention = CallingConvention.StdCall)]
static extern int CloseLog(IntPtr hLog);
The problem is that when my MSI runs and I invoke the custom action my call to CloseLog
throws the DllNotFoundException
exception.
I can manually add a link to log.dll
into my custom action C# DLL project:
But the problem is that there's no way to specify which build of the log.dll
to use from a C# project, i.e. x86/x64/debug/release.
So any suggestions how to do it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以通过在项目文件中定义 CustomActionContents 向 CA.dll 添加任何有效负载(左侧路径在 CA 中,右侧路径是您的本地路径)。
更新:
这在 WiX v4 中的工作原理相同。正斜杠/不起作用。
You can add any payload to the CA.dll by defining CustomActionContents in the project file like this (left path is in the CA right path is your local path).
Update:
This works the same in WiX v4. Forward slashes / do not work.
添加 DLL 作为内容 copylocal=true ,它将包含在自定义操作的当前目录中。
MSI 与平台无关,因此如果直接 x64/Release 不适合您,您应该构建 32 位 CA 和 64 位 CA 供 32 位 MSI 和 64 位 MSI 使用。
Add the DLL as content copylocal=true and it'll be included in the current directory of the custom action.
MSI is not platform agnostic so you should build a 32bit CA and 64bit CA to be consumed by a 32bit MSI and a 64bit MSI if straight up x64/Release doesn't work for you.
必须回答我自己的问题。
显然没有办法通过 UI 来做到这一点。因此,请在解决方案资源管理器中右键单击 C# 项目,然后选择
卸载项目
,然后在 XML 标记中找到文件名。所以事实证明,您可以这样做:
然后再次右键单击该项目并选择
重新加载项目
。它不会在属性窗口中正确显示,但会根据所选配置进行编译。
Have to answer my own question.
Evidently there's no way to do this via UI. So instead right-click your C# project in Solution Explorer, and select
Unload Project
, then locate the file name in the XML markup. So it turns out that instead of:you can do:
Then right-click the project again and select
Reload Project
.It won't show correctly in the properties window, but it will compile according to selected configuration.