【问题标题】:C# application and assembly hell!C# 应用程序和程序集地狱!
【发布时间】:2011-08-04 05:51:38
【问题描述】:

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

当我使用“regserver”创建安装脚本标记“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 版运行良好!

【问题讨论】:

  • Regsvr32 在安装程序运行时需要管理员权限。你能得到那个对象的 .net 版本吗?
  • 您可以从融合日志中获得更多信息。如果异常详细信息不包含融合日志信息,您可以通过其他方式获取,例如此处描述的方式:blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx
  • 如果您尝试在 32 位机器上安装 64 位 DLL,或者相反(使用 64 位的 32 位 DLL工具)。

标签: c# dll installation


【解决方案1】:

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

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

【讨论】:

  • 拜托,再来一次?! :) 真的,我不知道如何注册 dll-s,大多数情况下,当安装程序完成它的工作时,一切都正常......
【解决方案2】:

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

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

【讨论】:

  • 它适用于 Windows 7,因为它是在 Win7 上创建、构建和编译的。它不能在 WinXP 上运行!
  • @Nemo 它在你的机器上工作的原因也是因为 DLL 已经在你的机器上注册了。
  • @Nemo 就像我说的,将“PrivilegesRequired=admin”放入脚本的 [Setup] 部分。
  • @Nemo 另外,我不会到处乱扔ignoreversion(即使您没有在系统范围内更改任何内容)。这可能会使升级变得困难。
  • No,"PrivilegesRequired=admin" 不会改变任何东西! :\ 仍然无法在 WinXp 上运行!注册 dll 时出错(在我的问题中提到)仍然存在! RegSrv32 - 错误 0x4!
【解决方案3】:

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

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

更新。

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

【讨论】:

  • 我知道!我已经安装了“vcredist_x86”,我的测试计算机上也有 VS2008 - 不走运! :\
  • 您可以尝试从 sysinternals 下载并运行 Process Monitor。这将向您显示您的应用程序尝试加载的任何文件,并可能指向其他要求。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多