如何使用Inno Setup注册.NET DLL

10

我使用Visual Studio 2010 C#编写了一个类库,用于读取计算机的硬件信息(例如HDD / SSD)。我将使用这个dll创建一个安装程序,使用InnoSetup读取目标计算机的硬件信息。现在我的问题是,除非已经注册,否则无法直接使用.NET dll。我正在尝试找到一种方法,在InnoSetup中的InitializeSetup期间注册dll,以便我可以使用dll中的函数。下面是我为安装程序编写的脚本。

function InitializeSetup(): Boolean;
var
    obj: Variant;
    diskPartitions: Integer;
    va: String;
    ErrorCode: Integer;
    b: Boolean;
begin
    ExtractTemporaryFile('SSHardwareChecker.dll');
    RegisterServer(False, ExpandConstant('{tmp}\SSHardwareChecker.dll'), False);
    obj := CreateOleObject('SSHardwareChecker.SSClass');
    va := obj.GetDiskDriveInformation;
    MsgBox(va, mbInformation, mb_Ok);
    b:=UnregisterServer(False, ExpandConstant('{tmp}\SSHardwareChecker.dll'), False);
end;

函数RegisterServer似乎无法正常工作。它会抛出一个错误,其中写着RegSvr32 failed with exit code 0x4。我在网上阅读了很多文章,它们都说应该使用regasm来注册.net dll。我真的不知道如何做到这一点,特别是在Inno Setup中。

请帮忙,谢谢。

2个回答

12

虽然已经过去一年多了,但我最近遇到了同样的问题,并且使用以下脚本解决了它。

[Run]
Filename: "{dotnet20}\RegAsm.exe"; Parameters: /codebase YourDLL.dll; WorkingDir: {app}; StatusMsg: "Registering Controls..."; Flags: runminimized

如果文件在初始化步骤中已注册,我们可以使用Inno Setup的支持函数之一。

function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;

更多信息可以在此找到: Inno Setup帮助


1
请注意,这是在安装过程中发生的,因此对于“InitialiseSetup”期间使用DLL来说为时已晚。否则,这是一个有效的解决方案,可用于之后使用DLL。 - Deanna
1
@Nyerguds 我的猜想是,即使你在使用3.5版本,你也应该安装了2.0版本以及其中包含的所有核心可执行文件。我希望它也是操作系统的一部分。 - Venkatesh Kumar
1
@Venkatesh Kumar 我查了一下,似乎3.5被认为是2.0的“更新版本”,因此仍然使用2.0应用程序文件夹。所以{dotnet20}对于3.5也可以正常工作。无论如何,非常感谢,这段代码真的帮了我大忙 :) - Nyerguds
2
请注意,为了语言兼容性,您可以使用类似于 {code:StrStatusRegisterFiles} 作为 StatusMsg 来注册 dll 文件的原始状态消息,然后使该函数使用 result := SetupMessage(MsgStatusRegisterFiles); 从 [Messages] 获取原始的依赖于语言的安装程序字符串。 - Nyerguds

0

为此,您必须:

1)确保已安装 .net 4.0(大多数计算机默认未安装)

2)提取并注册 DLL(需要在提取的 DLL 上调用 regasm.exe)

这是为了执行 "GetDiskDriveInformation" 的安装中的第一步而需完成的很多工作。

最好是在 Inno 中本地获取信息或调用不具备前置条件的本地 DLL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接