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

时间:2011-04-12 21:12:42

标签: c# dll installation

我在家用计算机上使用Windows 7,VS 2008和使用.net framework 2.0创建了一个C#项目。我的应用程序使用“Irklang”声音库。使用InnoSetup 5我已经为我的应用程序创建了设置。安装包括所有需要的文件,它安装得很好,但当我在其他计算机上安装我的应用程序时,我遇到了一些令人困惑的错误。第一个看起来像这样:

enter image description here

当我使用“regserver”创建安装脚本flaging“irklang.dll”(在安装期间注册)时,我在安装程序时遇到此错误:“无法注册DLL / OCX:RegSrv32失败,退出代码为0x4 ”。消息得到标准的“中止,忽略,重试”按钮,但是,一如既往,“重试”将无法修复它。

我该怎么办?如何修复这个甚至不应该打扰普通程序员的错误?

这是我的Inno设置安装文件:

; 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 个答案:

答案 0 :(得分:0)

RegSrv32适用于COM dll,从外观上看,irklang.dll是一个.NET dll。

.NET DLL可以使用RegAsm.exe注册,如果它们需要可用于COM。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

错误消息确实说它无法加载IrrKlang.NET2.0 或其中一个依赖项,因此您可能会发现它需要其他dll才能工作,这恰好是您的一个机。

最好回到你有这个dll的地方,这应该记录下来。

更新

显然它需要MSVCR80.DLL和MSVCM80.DLL see here

答案 3 :(得分:0)

我正在浏览Google并遇到this forum post。看来,根据您使用的库版本,.NET 2.0可能存在已知问题。他们建议将此添加到您的app.config:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>