我有一个基本的MSI InstallShield安装,其中包含从Binary表运行的托管EXE自定义操作。我尝试了一个简单的测试,只运行一个控制台,并且运行正常。当我向EXE添加.DLL程序集引用时,它找不到DLL。如何让InstallShield知道这个引用的程序集,以便它可以用EXE加载它?
答案 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程序集可以有两种类型的依赖项:
DllImport
attribtue和定义良好的程序集搜索机制加载的。让我们了解OP的问题,即依赖托管程序集的问题:
仅为每个人提供的信息,即installshield内部拥有自己的数据库。因此,当您添加调用托管程序集中存在的方法的自定义操作(在您的installshield基本MSI项目中)时,自定义操作的所有属性都将作为记录放在内部数据库的ISClrWrap
表中如下所示:
现在,installshield不提供任何用户界面或直接机制,我们可以在其中定义托管程序集的依赖项(您在Visual Studio中的C#项目中添加的参考项)。但是您可以更新此数据库表以反映相同的情况。您需要为此表中的每个新依赖项添加一条记录。对于name列,您应该为第一个依赖项选择Dependency0
,为第二个依赖项选择Dependency1
,依此类推。在按下顶部的新按钮添加新记录后,请查看下面的快照,了解我是如何完成的:
添加完所有托管依赖项程序集后,表格开始如下所示:
那就是它。你是从这里完成的。将其余部分留给installshield。现在,MyManagedAssembly.dll
中的方法将能够在安装过程中调用MyManagedDependencyAssembly1.dll
或MyManagedDependencyAssembly2.dll
中存在的方法。
备注:
[SUPPORTDIR]
属性表示)中。 installshield如何在安装过程中管理托管依赖项程序集的复制是其内部实现细节。System.dll
,Systen.Core.dll
等。默认情况下,当InstallShield加载CLR以执行托管代码时,它们会被加载。