【问题标题】:InstallShield and working directoryInstallShield 和工作目录
【发布时间】:2014-01-31 00:25:26
【问题描述】:

我有一个 InstallShield 安装程序,它在安装期间调用 C++/CLI DLL Me.dll,而 Me.dll 又调用 C# 程序集; Microsoft.Foo.dll

当 InstallShield 安装程序尝试加载 Microsoft.Foo.dll 时,我收到 FileNotFoundException(即无法加载程序集)。

使用 fuslogvw.exe 它告诉我程序集正在尝试从桌面加载,这是我运行安装程序的地方。奇怪的是,在安装程序中我调用 ChangeDirectory,然后验证 SUPPORTDIR(即提取文件的临时目录)确实是当前目录。我还在所有程序集上尝试了 UseDLL,但这也不起作用。

如果我在安装期间手动将程序集复制到桌面,安装程序可以工作。

我一定是少了一步。如何将 InstallShields 当前工作目录更改为 SUPPORTDIR 以便正确找到此程序集?

【问题讨论】:

  • 如果安装程序正在调用 dll,那么它需要与安装程序位于同一文件夹中。更改目录与​​该问题无关。您似乎在安装程序 dll 和已安装 dll 之间存在某种混淆。安装的应用程序中是否也使用了 Microsoft.foo.dll?
  • 是的,它也用于已安装的应用程序中。更具体地说,我调用 UseDLL(SUPPORTDIR ^ "Me.dll");然后调用该 DLL 中的函数。 Me.dll 是引用 Microsoft.Foo.dll 的内容。
  • 然后需要在这两个地方,除非您打算尝试使用 appdomain.assembly 解析。 msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx
  • 我会看看那个。感谢您的帮助。

标签: installshield


【解决方案1】:

我以前玩过这么多耳朵(博客:Managed Code CAN Access the MSIHANDLE)。所有这些都被 Windows Installer XML (WiX) 部署工具基金会 (DTF) 淘汰了。阅读Deployment Tools Foundation (DTF) Managed Custom Actions 了解入门知识。

基本上,DTF 构建自定义操作 DLL,它在 Windows 安装程序中显示为标准 C/C++ 自定义操作。他们处理在进程外调用您的 C# 代码,以免使用 CLR 版本纹身 MSIEXEC,并使您的所有依赖项在当前目录中可用,并编组所有 MSI API 调用,将其作为 Session 类公开给您的代码。这确实是这里描述的黄金标准:Reasons DTF is Better

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多