C# 应用程序和程序集地狱!

3
我在家里的Windows 7电脑上使用VS 2008和.NET Framework 2.0创建了一个C#项目。我的应用程序使用"Irklang"音频库。我使用InnoSetup 5为我的应用程序创建了安装程序。安装程序包含所有需要的文件,它们被成功地安装,但是当我将我的应用程序安装到其他计算机上时,我遇到了一些令人困惑的错误。第一个错误看起来像这样:
当我在安装脚本中标记"irklang.dll"并使用"regserver"(在安装期间注册)时,在安装程序期间我收到了这个错误消息:"无法注册DLL/OCX:RegSrv32失败,退出代码为0x4"。消息有标准的"中止、忽略、重试"按钮,但是,如常,"重试"并不能解决问题。
我该怎么办?如何修复这个错误,这个错误甚至不应该困扰普通程序员?
这是我的Inno Setup安装文件:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[CustomMessages]
dotnetmissing=This setup requires the .NET Framework v2.0. Please download and install the .NET Framework v.2 and run this setup again. Do you want to download the framework now?

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{10087152-8A1D-4C0B-9BFC-E463C2F8E3C0}
AppName=Kucni rad
AppVersion=1.5
;AppVerName=Kucni rad 1.5
DefaultDirName={pf}\Kucni rad
DefaultGroupName=Kucni rad
OutputDir=C:\Users\Boza\Desktop
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes



[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Code]
function InitializeSetup(): Boolean;
var
    ErrorCode: Integer;
    NetFrameWorkInstalled : Boolean;
    Result1 : Boolean;
begin

    NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
    if NetFrameWorkInstalled =true then
    begin
        Result := true;
    end;

    if NetFrameWorkInstalled = false then
    begin
        NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
        if NetFrameWorkInstalled =true then
        begin
            Result := true;
        end;

        if NetFrameWorkInstalled =false then
            begin
                //Result1 := (ExpandConstant('{cm:dotnetmissing}'), mbConfirmation, MB_YESNO) = idYes;
                Result1 := MsgBox(ExpandConstant('{cm:dotnetmissing}'),
                        mbConfirmation, MB_YESNO) = idYes;
                if Result1 =false then
                begin
                    Result:=false;
                end
                else
                begin
                    Result:=false;
                    ShellExec('open',
                    'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe',
                    '','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
                end;
            end;
    end;
end;


[Dirs]
Name: "{app}\Sounds"

[Files]
Source: "C:\Users\Boza\Desktop\Novi kucnirad\kucnirad\bin\Debug\kucnirad.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Boza\Desktop\Novi kucnirad\kucnirad\bin\Debug\Sounds\*"; DestDir: "{app}\Sounds"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\Boza\Desktop\Novi kucnirad\kucnirad\bin\Debug\ikpMP3.dll"; DestDir: "{app}"; Flags: ignoreversion regserver
Source: "C:\Users\Boza\Desktop\Novi kucnirad\kucnirad\bin\Debug\irrKlang.NET2.0.dll"; DestDir: "{app}"; Flags: ignoreversion regserver

; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Kucni rad"; Filename: "{app}\kucnirad.exe"
Name: "{group}\{cm:UninstallProgram,Kucni rad}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Kucni rad"; Filename: "{app}\kucnirad.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\kucnirad.exe"; Description: "{cm:LaunchProgram,Kucni rad}"; Flags: nowait postinstall skipifsilent

编辑: 我明白了!问题不在我的应用程序上,而在于下载的DLL本身!似乎IrrKlang.dll版本1.3(我使用的最新版本)引起了问题!版本1.1工作得很好!


4
当安装程序在运行时,Regsvr32需要管理员权限。你能否获取该对象的.NET版本? - 3Dave
您可以从融合日志中获取更多信息。如果异常详细信息中不包含融合日志信息,则可以通过其他方式获取,例如在此处描述的方式:http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx - Cirdec
如果您试图在32位计算机上安装64位DLL,或者反过来(使用64位工具的32位DLL),也可能会出现这种情况。 - Jim Mischel
4个回答

0
我在谷歌上搜索时发现了这篇论坛帖子。根据你使用的库的版本,.NET 2.0可能存在已知问题。他们建议将以下内容添加到您的app.config文件中:
<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup> 

0

RegSrv32用于COM dll,从irklang.dll的外观来看,它是.NET dll。

如果需要将.NET DLL注册为COM,可以使用RegAsm.exe进行注册。


请再说一遍? :) 实际上,我对注册DLL毫无头绪,大多数情况下都是安装程序自动完成... - Nemo

0

我假设这是在Windows Vista或7上?在您的InnoSetup文件中添加要求用户为管理员的要求。

即,在脚本的[Setup]部分中添加“PrivilegesRequired=admin”。


它能在Windows 7上运行,因为它是在Win7上创建、构建、编译的。它不能在WinXP上运行! - Nemo
@Nemo 另外,它在你的机器上能够运行的原因是因为 DLL 已经在你的机器上注册了。 - AngryHacker
@Nemo 就像我说的那样,在脚本的 [Setup] 部分中加入 "PrivilegesRequired=admin"。 - AngryHacker
@Nemo,另外,我不会到处使用ignoreversion(即使您没有在系统范围内更改任何内容)。这可能会使升级变得困难。 - AngryHacker
不,"PrivilegesRequired=admin" 不会改变任何东西!:\ 在 WinXp 上仍然无法工作!在注册 dll 时出现错误(在我的问题中提到)。RegSrv32 - 错误 0x4! - Nemo
你不应该尝试注册本地的dotnet dlls,所以我建议从irrKlang.NET2.0行中移除regserver标志。 - sgmoore

0
错误信息确实说无法加载IrrKlang.NET2.0 或其某个依赖项,因此您可能会发现它需要其他dll才能工作,这些dll恰好位于您的机器上。

最好返回获取此dll的位置,因为应该有相关文档。

更新。

显然需要MSVCR80.DLL和MSVCM80.DLL 请在此处查看


我知道!我已经安装了“vcredist_x86”,我的测试计算机上也有VS2008 - 但没有运气!:\ - Nemo
你可以尝试从Sysinternals下载并运行Process Monitor。这将显示应用程序正在尝试加载的任何文件,并可能指向其他要求。 - sgmoore

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