如何在InstallScript中从.NET dll调用方法

时间:2014-01-31 10:07:34

标签: .net dll installshield installscript

我需要在InstallScript中调用.NET dll中的函数。我该怎么办?

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

using System;
using System.Windows.Forms;

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

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

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;

我有两个问题:只有当我使用硬编码的绝对路径调用UseDLL到TestLibrary.dll时,UseDLL返回0(0表示dll已成功加载)。第二个问题 - 假设,我成功加载了DLL。我怎样才能调用我的TestFunction并看到“Hello”消息框呢?

2 个答案:

答案 0 :(得分:1)

UseDLL仅适用于非托管代码。对于.NET,请使用DotNetCoCreateObject。但说实话,对于MSI项目,我会完全跳过InstallScript并直接使用C#。 Windows Installer XML(WiX)具有一个名为Deployment Tools Foundation(DTF)的功能,可以构建与Windows Installer兼容的托管自定义操作。输出DLL看起来像是Windows Installer的传统Win32 DLL,并且与InstallShield兼容。

答案 1 :(得分:1)

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

在汇编文件中-指定要在此CA中使用的.dll文件或.exe。

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

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