【问题标题】:InstallShield CustomAction : How to load the managed dependency assembliesInstallShield CustomAction:如何加载托管依赖程序集
【发布时间】:2012-11-25 00:49:10
【问题描述】:

我有一个基本的 MSI InstallShield 安装,其中包含从二进制表运行的托管 EXE 自定义操作。我尝试了一个简单的测试,它只运行一个控制台并且工作正常。当我向 EXE 添加 .DLL 程序集引用时,它找不到 DLL。如何让 InstallShield 知道这个引用的程序集,以便它可以使用 EXE 加载它?

【问题讨论】:

    标签: windows-installer installshield


    【解决方案1】:

    自定义操作仅以临时名称将单个文件提取到临时位置。要使对 .dll 的依赖项起作用,它们都需要被提取,并且至少 .dll 必须具有预期的名称。通常,通过将两者都添加到“设置文件”并为自定义操作引用 [SUPPORTDIR]\your.exe,这是最简单的方法。

    【讨论】:

      【解决方案2】:

      好吧,我将添加详细信息 w.r.t. Installshield 2014 关于它今天的工作原理。其他答案可以同样正确w.r.t。其他 installshield 版本。我可以看到迈克尔的回答是从 2012 年开始的,从那时起很多事情都发生了变化。让我们看看。

      .Net 程序集可以有两种类型的依赖项:

      1. 托管(用 C# 或 VB.Net 语言编写。OP 有这种特殊情况)
      2. 非托管或本机(例如,通过 p/invoke 调用的 C++ dll)。您不会在 C# 项目中引用此类程序集,但它们会在运行时使用 DllImport 属性和定义明确的程序集搜索机制加载。

      让我们了解 OP 的问题,即依赖托管程序集的情况:

      仅供大家参考,installshield 内部有一个自己的数据库。因此,当您添加调用托管程序集中存在的方法的自定义操作(在您的 installshield 基本 MSI 项目中)时,自定义操作的所有属性都将作为记录放在内部数据库的 ISClrWrap 表中,如下所示:

      现在 installshield 不提供任何用户界面或直接机制,我们可以在其中定义托管程序集的依赖项(您在 Visual Studio 的 C# 项目中作为引用添加的那些)。但是您可以更新此数据库表以反映相同的情况。您需要为该表中的每个新依赖项添加一条记录。对于名称列,您应该为第一个依赖项选择Dependency0,为第二个依赖项选择Dependency1,依此类推。请看下面的快照,了解我在按下顶部的新按钮以添加新记录后是如何完成的:

      添加所有托管依赖程序集后,表格开始如下所示:

      就是这样。你从这里完成。剩下的留给 installshield。现在MyManagedAssembly.dll 中的方法将能够在安装过程中调用MyManagedDependencyAssembly1.dllMyManagedDependencyAssembly2.dll 中的方法。

      注意事项

      1. 您不必将托管依赖程序集添加到支持文件(其路径由[SUPPORTDIR] 属性表示)。 installshield 如何在安装过程中管理托管依赖程序集的复制是其内部实现细节。
      2. 您的 C# 项目(用于自定义操作)对核心 .NET 程序集的依赖关系,这些程序集是 .NET 框架 FCL 的一部分,例如System.dllSysten.Core.dll 等不需要添加到此表中。它们在 InstallShield 加载 CLR 以执行托管代码时默认加载。

      【讨论】:

      • 请注意,最初的问题是(我相信)启动恰好是托管代码的 EXE,而不是从恰好是 EXE 的托管程序集中显式调用函数。您描述的方法仅适用于“托管代码自定义操作” - 调用函数的方法。 (自 IS2009 以来,这没有显着变化)。
      【解决方案3】:

      我找不到合适的方式来使用 .Net 自定义操作来让我做我想做的事情。我最终使用了 WiX 的 DTF(部署工具基础)部分来创建程序集,并且效果很好。

      【讨论】:

        【解决方案4】:

        请将您的 DLL 作为依赖项添加到“isclrwrap”二进制表中。您可以从直接编辑器中找到该二进制表。这将解决您的问题。

        【讨论】:

        • 我可以看到 ISCrWrap 表,但不确定如何将程序集添加到其中。我有我的 .net 程序集,它在运行时加载本机 C++ 程序集以通过 p/invoke 调用一些方法。您能否在您的帖子中添加一些关于如何实现它的步骤?
        猜你喜欢
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        相关资源
        最近更新 更多