2

I have a C# WinForms .NET app in which I'm trying to write to a zip archive and read from it using System.IO.Compression.

Here's now I create the ziparchive:

    public void SaveStdV20ZipProject(string strfilepath, clsProjectInfo GameInfo)
    {
        using (var ms = new MemoryStream())
        {
            using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true))
            {
                string strProjectData = String.Empty;
                StringBuilder sb = new StringBuilder();

                // First, we add the Game Info data...
                sb.AppendLine(GameInfo.strGameVersion);
                sb.AppendLine(GameInfo.strProjectType);
                sb.AppendLine(GameInfo.strGameTitle);
                sb.AppendLine(GameInfo.strAuthor);
                sb.AppendLine(GameInfo.strCreationDate);
                sb.AppendLine(GameInfo.blTSImagePresent.ToString());
                sb.AppendLine(GameInfo.blTSAudioPresent.ToString());
                sb.AppendLine(GameInfo.blTSVideoPresent.ToString());
                sb.AppendLine(GameInfo.blFSSImagePresent.ToString());
                sb.AppendLine(GameInfo.blFSSAudioPresent.ToString());
                sb.AppendLine(GameInfo.blFSSVideoPresent.ToString());
                sb.AppendLine(GameInfo.intTotalQuestions.ToString());
                sb.AppendLine(GameInfo.intTotalMediaItems.ToString());
                sb.AppendLine(GameInfo.intTotalCategories.ToString());
                sb.AppendLine(GameInfo.blTiebreakerPresent.ToString());

                // Next, create an archive entry for the Game Data string...
                strProjectData = sb.ToString();

                var ProjectData = archive.CreateEntry("ProjectData.txt");

                using (var entryStream = ProjectData.Open())
                using (var streamWriter = new StreamWriter(entryStream))
                {
                    streamWriter.Write(strProjectData);
                }

                // We're done writing all the data for this project. Now let's write it to the file...
                using (var fileStream = new FileStream(@strfilepath, FileMode.Create))
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.CopyTo(fileStream);
                }
            }
        }
    }

And here's how I open it:

    public void OpenStdV20ZipProject(string strfilepath)
    {
        string zipPath = strfilepath;
        string extractPath = Path.GetTempFileName();

        using (ZipArchive archive = ZipFile.OpenRead(zipPath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
                {
                    using (StreamReader sr = new StreamReader(extractPath))
                    {
                        clsProjInfo.strGameVersion = (string)sr.ReadLine();
                        clsProjInfo.strProjectType = (string)sr.ReadLine();
                        clsProjInfo.strGameTitle = (string)sr.ReadLine();
                        clsProjInfo.strAuthor = (string)sr.ReadLine();
                        clsProjInfo.strCreationDate = (string)sr.ReadLine();
                        clsProjInfo.blTSImagePresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blTSAudioPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blTSVideoPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSImagePresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSAudioPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.blFSSVideoPresent = Convert.ToBoolean(sr.ReadLine());
                        clsProjInfo.intTotalQuestions = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.intTotalMediaItems = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.intTotalCategories = Convert.ToInt32(sr.ReadLine());
                        clsProjInfo.blTiebreakerPresent = Convert.ToBoolean(sr.ReadLine());
                    }
                }
            }
        }
    }         // <-THIS IS LINE 1320

It throws a Missing Method Exception and I've looked high and low in the Internet for a fix. Here's the stack trace:

System.MissingMethodException occurred
  HResult=0x80131513
  Message=Method not found: 'System.IO.Compression.ZipArchive       System.IO.Compression.ZipFile.OpenRead(System.String)'.
  Source=TASv20ClsLib
  StackTrace:
   at TASv20ClsLib.clsOpenStandardProject.OpenStdV20ZipProject(String strfilepath) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\TASv20ClsLib\Class1.cs:line 1320
   at Trivia_Author_v20.frmMain.openV20ProjectToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\Trivia Author v10 New Approach\frmMain.cs:line 1627
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e,     ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at Trivia_Author_v20.Program.Main(String[] args) in C:\Users\Reuben\Documents\Visual Studio 2017\Projects\C# Projects\TRIVIA AUTHOR SUITE V20 PROJECTS 2\TAS v20 Zip Test Jun14 2\Trivia Author v10 New Approach\Program.cs:line 126
  • 1
    a MissingMethodException means that the dlls shipped with your application are not compatible with eachother (in that: one of the libraries is trying to use a method from *another* library that *doesn't exist*). In particular, it might mean that you're using a package that targets a different version of .NET than you are using. Do you get any build warnings about this? – Marc Gravell Jun 14 '17 at 23:43
  • Are both of this fragments of code from the same project? (Do they share the assembly references?) – David Álvarez Jun 14 '17 at 23:49
  • 1
    Possible duplicate of [I didn't find "ZipFile" class in the "System.IO.Compression" namespace](https://stackoverflow.com/questions/15241889/i-didnt-find-zipfile-class-in-the-system-io-compression-namespace) – Tien Nguyen Ngoc Jun 15 '17 at 04:02

3 Answers3

3

The ZipFile.OpenRead(string) method was added only in .NET 4.5. It does not exist in previous versions.

Your question is not clear about which version of .NET your project targets, nor which version of .NET is installed where you are trying to run it, but undoubtedly, you have targeted .NET 4.5 or higher, but are trying to run the code on which only an older version of .NET is installed.

To fix this, either make sure .NET 4.5 is installed on the machine where you want to run the code, or use the older API. For example, you can write your own OpenRead(string) method without much difficulty:

ZipArchive OpenRead(string filename)
{
    return new ZipArchive(File.OpenRead(filename), ZipArchiveMode.Read);
}
}
Peter Duniho
  • 68,759
  • 7
  • 102
  • 136
2

This is part of a whole host of binding issues introduced in 4.6x versions of .Net Framework. It may work somewhere, but not other places.

Most of this is related binding redirect issues that they have had between 4.6.1 and 4.7.1. Fixed in 4.7.2. These issues usually manifest themselves when working in the Framework and referencing .Net Standard packages

It is addressed in this framework issue: https://github.com/dotnet/corefx/issues/7702

Your best bet is to use binding redirects in your .Config file, or upgrade to .Net Framework 4.7.2 or later

Bytemaster
  • 166
  • 7
-1

Here i used Ionic and its working good, You can use

You need to import Ionic.zip to your project.

using (var zip = Ionic.Zip.ZipFile.Read("YourFilePAth"))
{
    <enter code here>
};
Irvin Dominin
  • 30,819
  • 9
  • 77
  • 111