3

我需要从 InstallScript 中的 .NET DLL 调用函数。我该怎么做?

让我们从简单的 Hello World 开始。假设,我创建了简单的类库TestLibrary.dll

using System;
using System.Windows.Forms;

namespace TestLibrary
{
    public static class TestClass
    {
        public static void TestFunction()
        {
            MessageBox.Show("Hello!");
        }
    }
 }

我不想在目标机器上安装这个 DLL,我只想TestFunction()在安装过程中运行,所以我只是TestLibrary.dll在 SupportFiles 视图中添加了(我使用 InstallShield 2013 Professional,Basic MSI Project Type)。然后在 InstallScript 中,我正在为它编写原型,加载TestLibrary.dll并尝试从中调用TestFunction。像这样的东西:

export prototype TestDllFunction(HWND); //call in Custom Action
prototype TestLibrary.TestFunction(); 
.......

function TestDllFunction(hMSI)
    NUMBER Result;
begin
    Result = UseDLL(SUPPORTDIR ^ "TestLibrary.dll");
    TestLibrary.TestFunction();
    Result = UnUseDLL("TestLibrary.dll");
end;

我这里有 2 个问题:UseDLL仅当我UseDLL使用硬编码的绝对路径调用TestLibrary.dll. 第二个问题 - 假设我成功加载了 DLL。那么我怎样才能调用我的TestFunction并看到一个“Hello”消息框呢?

4

2 回答 2

1

UseDLL 仅适用于非托管代码。对于 .NET 使用DotNetCoCreateObject。但老实说,对于 MSI 项目,我会完全跳过 InstallScript 并直接使用 C#。Windows Installer XML (WiX) 具有称为部署工具基础 (DTF) 的功能,它可以构建与 Windows Installer 兼容的托管自定义操作。输出 DLL 在 Windows Installer 中看起来像传统的 Win32 DLL,并且与 InstallShield 兼容。

于 2014-01-31T19:23:51.943 回答
1

如果您为 .dll 编写了 C# 代码,则不建议使用安装脚本,而是通过右键单击自定义操作来创建存储在二进制表中的“新托管代码”。

在程序集文件中 - 指定要在此 CA 中使用的 .dll 文件或 .exe。

在方法签名中 - 单击省略号按钮并选择您的 dll 中使用的类名、方法名和参数。在参数值中,您还可以选择属性名称。在返回属性中,您可以指定一个属性,该属性存储和显示来自 .dll 的返回值。单击确定。

现在,您可以在需要时调用此自定义操作。这将调用您的 .dll 的功能并解决您的问题。

于 2018-07-25T10:00:50.953 回答