首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dotnetzip OverflowException

Dotnetzip OverflowException
EN

Stack Overflow用户
提问于 2013-06-14 14:55:02
回答 1查看 715关注 0票数 3

我正在使用C#进行开发,并使用Dotnetzip的源代码将应用程序放入一个文件中。

但是在运行时,我得到了一个异常:

代码语言:javascript
复制
System.OverflowException: Arithmetic operation resulted in an overflow.
   at Ionic.Crc.CRC32..ctor(Int32 polynomial, Boolean reverseBits) in DotNetZip\CRC32.cs:line 452
   at Ionic.Crc.CRC32..ctor(Boolean reverseBits) in DotNetZip\CRC32.cs:line 418
   at Ionic.Crc.CRC32..ctor() in DotNetZip\CRC32.cs:line 398
   at Ionic.Crc.CrcCalculatorStream..ctor(Boolean leaveOpen, Int64 length, Stream stream, CRC32 crc32) in DotNetZip\CRC32.cs:line 622
   at Ionic.Crc.CrcCalculatorStream..ctor(Stream stream) in DotNetZip\CRC32.cs:line 519
   at Ionic.Zip.ZipEntry.ExtractOne(Stream output) in DotNetZip\ZipEntry.Extract.cs:line 1043
   at Ionic.Zip.ZipEntry.InternalExtract(String baseDir, Stream outstream, String password) in DotNetZip\ZipEntry.Extract.cs:line 870
   at Ionic.Zip.ZipEntry.Extract(String baseDirectory, ExtractExistingFileAction extractExistingFile) in DotNetZip\ZipEntry.Extract.cs:line 240
   at ItxInstaller.Package.GetData(String instFilePath) in Package.cs:line 32
   at ItxInstaller.Install..ctor() in Install.cs:line 26
   at ItxInstaller.Program.Main(String[] args) in Program.cs:line 54

Install.cs如下所示:

代码语言:javascript
复制
public Install()
{
    // The InitializeComponent() call is required for Windows Forms designer support.
    this.InitializeComponent();
    Package pack = Package.GetData(Program.args[1]);
    this.Title.Text = pack.AppName;
    this.PathBox.Text = pack.GeneratePath();
}

Package.cs包含GetData():

代码语言:javascript
复制
class Package
    {
        public string AppName;
        public string ExePath;

        private string FilePath;

        public Package(string filePath)
        {
            this.ValueInit(filePath);
            this.FilePath = filePath;
        }

        public static Package GetData(string instFilePath)
        {
            using (ZipFile Package = ZipFile.Read(instFilePath))
            {
                Package["app.itx"].Extract(Path.GetTempPath(), ExtractExistingFileAction.OverwriteSilently);
            }

            return new Package(Path.Combine(Path.GetTempPath(), "app.itx"));
        }
}

如何解决这个异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-14 16:48:22

当使用"-checked+“作为参数时,我可以用Mono重现这个问题,即启用算术检查。省略此参数将导致可执行文件正常工作。

在Visual Studio中也有它的项目设置。

我已经将相关代码提取到此工作程序中,以便您可以自己测试它:

代码语言:javascript
复制
using System;

namespace Test {
    public class Program {
    public static void Main(string[] args) {
            CRC32 test = new CRC32();
            Console.Out.WriteLine(test.dwPolynomial);
        }
    }

    public class CRC32 {
        public UInt32 dwPolynomial;

        public CRC32() : this(false) {
        }

        public CRC32(bool reverseBits) :
            this(unchecked((int)0xEDB88320), reverseBits) {
        }

        public CRC32(int polynomial, bool reverseBits) {
            this.dwPolynomial = (uint) polynomial; // this is line 452
        }
    }
}

使用dcms test.cs && mono test.exe运行得很好。

使用dcms -checked+ test.cs && mono test.exe会导致

代码语言:javascript
复制
Unhandled Exception: System.OverflowException: Number overflow.
    at Test.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.OverflowException: Number overflow.
    at Test.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

更新:如果你不能或者不想禁用算术检查,那么你可以修改LIK452的源代码

代码语言:javascript
复制
this.dwPolynomial = unchecked((uint) polynomial);

这将关闭表达式的算术检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17102740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档