【问题标题】:How to invoke method from .NET DLL in InstallScript如何在 InstallScript 中从 .NET DLL 调用方法
【发布时间】:2014-01-31 10:07:34
【问题描述】:

我需要在 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(),所以我只是在SupportFiles视图中添加了TestLibrary.dll(我使用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 仅在我使用硬编码的绝对路径调用 UseDLLTestLibrary.dll 时才返回 0(0 表示 DLL 已成功加载)。第二个问题 - 假设我成功加载了 DLL。我怎样才能调用我的TestFunction 并看到一个“Hello”消息框呢?

【问题讨论】:

    标签: .net dll installshield installscript


    【解决方案1】:

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

    【讨论】:

    • 克里斯托弗,感谢您的回答。它可能很有用。但是我已经通过创建新的托管代码自定义操作解决了我的问题(没有 installScript),我可以在其中指定 dll 的路径和要使用的方法签名。我也可以将一些参数传递给函数并将其返回值设置为属性。它对我来说很好用,这正是我想要的!
    • 我真的不推荐这个。您使用 CLR 版本纹身 msiexec 沙箱。安装程序完成后,此沙盒会保留 10 分钟。如果一个 MSI 纹身说 2.0 退出,那么你安装并需要说 4.0,你会得到一个 BadImageFormat 异常。此外,您无权访问 MSI 句柄,因此很难进行正确的日志记录和数据驱动的自定义操作。不要误会我的意思,当他们添加它时这是一个很好的功能,但今天存在更好的解决方案。大约在 2006 年至 2008 年所有这些技术发布时,我的博客都涵盖了这一切。
    • @AndreyS:你能详细分享一下吗?我也面临同样的问题。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多