我需要在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”消息框呢?
答案 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函数并解决您的问题。