2011-04-11 370 views
7

我已经使用Visual Studio 2010 C#编写了一个类库来读取计算机硬件信息(例如HDD/SSD)。我将使用此DLL创建一个使用InnoSetup的安装程序来读取目标计算机的硬件信息。现在我的问题是.NET dll不能直接使用,除非它已被注册。我试图找到一种方法来在InnoSetup的InitializeSetup期间注册dll,这样我就可以使用dll中的函数。这是我为安装程序编写的脚本。如何使用Inno Setup注册.NET 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似乎并不work.It抛出它说RegSvr32 failed with exit code 0x4错误。我在网上阅读了很多文章,称.net dll应该使用regasm进行注册。我真的不知道如何做到这一点,特别是在Inno Setup中。

请帮帮忙。

回答

0

要做到这一点,必须..

1)确保.NET 4.0安装(默认情况下在大多数机器上还)

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

这只是“GetDiskDriveInformation”作为安装的第一步所做的很多事情。

在Inno中本地获取信息或调用不具备先决条件的本机DLL会好得多。

9

尽管一年多来,我最近也遇到了同样的问题,并能够使用下面的脚本进行纠正。

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

如果该文件已在初始化步骤注册,我们可以使用的创新安装的支持功能之一。

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

更多信息可参见: Inno Setup Help

+1

注意,这种情况发生在安装过程中,因此,已经为时已晚时'InitialiseSetup'使用的DLL。否则,这是后续使用DLL的有效解决方案。 – Deanna 2012-09-12 15:30:37

+0

如果你在使用framework 3.5,该怎么办?有没有这样的常数...... – Nyerguds 2013-03-19 13:19:12

+1

@Nyerguds我认为事实上,如果你在3.5工作,你应该已经安装了2.0内部的所有核心可执行文件。我希望它也是操作系统的一部分。 – 2013-03-21 00:16:17