【问题标题】:peverify error "Stack depth differs depending on path"peverify 错误“堆栈深度因路径而异”
【发布时间】:2014-08-04 21:08:36
【问题描述】:

我在 .dll 的发布版本上运行了 peverify,它给了我错误“堆栈深度因路径而异”:

[IL]: Error: [C:\tfs\EcoSys\SCM\NextGenInstaller\Cmc.Installer\Cmc.Installer.Desktop\bin\Release\Cmc.Installer.Modules.Crm.dll : Cmc.Installer.Modules.Crm.Models.DatabaseInfo::set_Action][offset 0x0000007F] Stack depth differs depending on path.
1 Error(s) Verifying C:\tfs\EcoSys\SCM\NextGenInstaller\Cmc.Installer\Cmc.Installer.Desktop\bin\Release\Cmc.Installer.Modules.Crm.dll

set_Action的代码如下:

public InstallerAction Action
{
    get { return _action; }
    set
    {
        _action = value;

        InstallMainServer = false;
        InstallDistributorServer = false;
        InstallAnalyticsServer = false;
        InstallMediaServer = false;
        InstallWebTrakServer = false;

        switch (DatabaseType)
        {
            case DatabaseType.Main:
                InstallMainServer = (Action == InstallerAction.Install);
                break;
            case DatabaseType.Distributor:
                InstallDistributorServer = (Action == InstallerAction.Install);
                break;
            case DatabaseType.Analytics:
                InstallAnalyticsServer = (Action == InstallerAction.Install);
                break;
            case DatabaseType.Media:
                InstallMediaServer = (Action == InstallerAction.Install);
                break;
            case DatabaseType.WebTrak:
                InstallWebTrakServer = (Action == InstallerAction.Install);
                break;
            default:
                throw new ArgumentOutOfRangeException("DatabaseType");
        }
    }
}

我不知道为什么这个错误只发生在发布版本中。

【问题讨论】:

  • 这是 C# 编译器中的一个错误。什么版本?
  • 或验证者 :) 安装程序往往会做一些奇怪的事情。这是一个非常严重的事故,这里没有人可以修复,求助于编译代码的工具的任何人。 Connect.microsoft.com 如果是 Microsoft,他们将需要一个重现项目。
  • Visual Studio 2013 / .NET 4.5.0(VS 和 TFS 版本)。这里不涉及安装程序。我可以在本地随意复制。
  • 我在这里提交了错误报告bit.ly/1s6kyGQ

标签: c# jit peverify


【解决方案1】:

虽然可能与 OP 的问题没有直接关系,但我也遇到了这个错误。我正在生成用于反序列化 HashSet<T> 的 IL 代码 - 问题是评估堆栈不平衡,因为 HashSet<T> 中的 Add 方法返回一个布尔值,而不是 void。所以调用它会推送一个我不关心的布尔值。在 Add 调用解决问题后立即调用 Pop

            //T x; Deserialize(stream, out x, ctx);
            var x = emit.declocal(elementType);
            emit.ldarg_0()
                .ldloca_s(x)
                .ldarg_2()
                .call(deserialize);

            //value.Add(x);
            emit.ldarg_1()
                .ldind_ref()
                .ldloc_s(x)
                .call(add) // returns bool, since we're not using the value we need to pop the stack to keep the balance
                .pop();

【讨论】:

猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多