InstallShield CustomAction:如何加载托管依赖项程序集

时间:2012-12-06 21:30:45

标签: windows-installer installshield

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我找不到合适的方式来使用.Net自定义操作,这些操作让我可以做我想做的事情。我最终使用WiX的DTF(部署工具基础)部分来创建程序集,它运行良好。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

  1. 管理(用C#或VB.Net语言编写.OP有这个特殊情况)
  2. Unamanaged或Native(例如通过p / invoke调用的C ++ dll)。您不在C#项目中引用此类程序集,但它们是在运行时使用DllImport attribtue和定义良好的程序集搜索机制加载的。
  3. 让我们了解OP的问题,即依赖托管程序集的问题:

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

    enter image description here

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

    enter image description here

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

    enter image description here

    那就是它。你是从这里完成的。将其余部分留给installshield。现在,MyManagedAssembly.dll中的方法将能够在安装过程中调用MyManagedDependencyAssembly1.dllMyManagedDependencyAssembly2.dll中存在的方法。

    备注

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