【发布时间】:2012-11-25 00:49:10
【问题描述】:
我有一个基本的 MSI InstallShield 安装,其中包含从二进制表运行的托管 EXE 自定义操作。我尝试了一个简单的测试,它只运行一个控制台并且工作正常。当我向 EXE 添加 .DLL 程序集引用时,它找不到 DLL。如何让 InstallShield 知道这个引用的程序集,以便它可以使用 EXE 加载它?
【问题讨论】:
标签: windows-installer installshield
我有一个基本的 MSI InstallShield 安装,其中包含从二进制表运行的托管 EXE 自定义操作。我尝试了一个简单的测试,它只运行一个控制台并且工作正常。当我向 EXE 添加 .DLL 程序集引用时,它找不到 DLL。如何让 InstallShield 知道这个引用的程序集,以便它可以使用 EXE 加载它?
【问题讨论】:
标签: windows-installer installshield
自定义操作仅以临时名称将单个文件提取到临时位置。要使对 .dll 的依赖项起作用,它们都需要被提取,并且至少 .dll 必须具有预期的名称。通常,通过将两者都添加到“设置文件”并为自定义操作引用 [SUPPORTDIR]\your.exe,这是最简单的方法。
【讨论】:
好吧,我将添加详细信息 w.r.t. Installshield 2014 关于它今天的工作原理。其他答案可以同样正确w.r.t。其他 installshield 版本。我可以看到迈克尔的回答是从 2012 年开始的,从那时起很多事情都发生了变化。让我们看看。
.Net 程序集可以有两种类型的依赖项:
DllImport 属性和定义明确的程序集搜索机制加载。让我们了解 OP 的问题,即依赖托管程序集的情况:
仅供大家参考,installshield 内部有一个自己的数据库。因此,当您添加调用托管程序集中存在的方法的自定义操作(在您的 installshield 基本 MSI 项目中)时,自定义操作的所有属性都将作为记录放在内部数据库的 ISClrWrap 表中,如下所示:
现在 installshield 不提供任何用户界面或直接机制,我们可以在其中定义托管程序集的依赖项(您在 Visual Studio 的 C# 项目中作为引用添加的那些)。但是您可以更新此数据库表以反映相同的情况。您需要为该表中的每个新依赖项添加一条记录。对于名称列,您应该为第一个依赖项选择Dependency0,为第二个依赖项选择Dependency1,依此类推。请看下面的快照,了解我在按下顶部的新按钮以添加新记录后是如何完成的:
添加所有托管依赖程序集后,表格开始如下所示:
就是这样。你从这里完成。剩下的留给 installshield。现在MyManagedAssembly.dll 中的方法将能够在安装过程中调用MyManagedDependencyAssembly1.dll 或MyManagedDependencyAssembly2.dll 中的方法。
注意事项:
[SUPPORTDIR] 属性表示)。 installshield 如何在安装过程中管理托管依赖程序集的复制是其内部实现细节。System.dll、Systen.Core.dll 等不需要添加到此表中。它们在 InstallShield 加载 CLR 以执行托管代码时默认加载。【讨论】:
我找不到合适的方式来使用 .Net 自定义操作来让我做我想做的事情。我最终使用了 WiX 的 DTF(部署工具基础)部分来创建程序集,并且效果很好。
【讨论】:
请将您的 DLL 作为依赖项添加到“isclrwrap”二进制表中。您可以从直接编辑器中找到该二进制表。这将解决您的问题。
【讨论】: