C#应用程序和组装地狱!

C#应用程序和组装地狱!,c#,dll,installation,C#,Dll,Installation,我在家用电脑上用Windows7、VS2008和.NETFramework2.0创建了一个C#项目。我的应用程序正在使用“Irkang”声音库。使用InnoSetup 5,我已经为我的应用程序创建了安装程序。安装程序包括了所有需要的文件,它安装得很好,但当我在其他计算机上安装我的应用程序时,我遇到了一些令人困惑的错误。第一个看起来像这样: 当我创建标记为“irklang.dll”和“regserver”(将在安装过程中注册)的安装脚本时,我在安装程序时遇到了以下错误:“无法注册dll/OCX:

我在家用电脑上用Windows7、VS2008和.NETFramework2.0创建了一个C#项目。我的应用程序正在使用“Irkang”声音库。使用InnoSetup 5,我已经为我的应用程序创建了安装程序。安装程序包括了所有需要的文件,它安装得很好,但当我在其他计算机上安装我的应用程序时,我遇到了一些令人困惑的错误。第一个看起来像这样:

当我创建标记为“irklang.dll”和“regserver”(将在安装过程中注册)的安装脚本时,我在安装程序时遇到了以下错误:“无法注册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版运行得很好

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


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

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


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

错误消息确实表明它无法加载IrrKlang.NET2.0或其依赖项之一,因此您可能会发现它需要其他DLL才能工作,而这些DLL恰好是您的机器上的一个DLL

最好回到你得到这个dll的地方,它应该有文档记录

更新


显然,它需要MSVCR80.DLL和MSVCM80.DLL,我在谷歌搜索时发现了。看起来,根据您使用的库的版本,可能存在.NET2.0的已知问题。他们建议将此添加到app.config:

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


Regsvr32在安装程序运行时需要管理员权限。你能得到该对象的.net版本吗?你可以从fusion日志中获得更多信息。如果异常详细信息不包括fusion日志信息,您可以通过其他方式获得它,如此处所述:如果您试图在32位计算机上安装64位DLL,或者通过其他方式(使用64位工具的32位DLL),也可能会发生这种情况。它在Windows 7上工作,因为它是创建、构建和,在Win7上编译。它在WinXP上不起作用@Nemo在您的计算机上运行的另一个原因是,DLL已经在您的计算机上注册了。@Nemo如我所说,将“PrivilegesRequired=admin”放入脚本的[Setup]部分。@Nemo同样,我不会到处乱扔
ignoreversion
(即使您没有在系统范围内更改任何内容)。这可能会使升级变得困难。不,“PrivilegesRequired=admin”不会改变任何东西!:\仍然无法在WinXp上工作!注册dll时出错(在我的问题中提到)仍然存在!RegSrv32-错误0x4!请再来一次?!:)真的,我不知道如何注册dll-s,大多数情况下,当安装程序完成它的工作时,一切都正常了…我知道!我已经安装了“vcredist_x86”,我的测试计算机上也安装了VS2008-不走运\您可以尝试从系统内部下载并运行Process Monitor。这将显示应用程序试图加载的任何文件,并且可能指向其他需求。