In a class that sometimes needs to pass multiple data structures asynchronously within itself (like Net.Mail.SendAsync()) , it is appropriate that since all of this is in the private scope of the class, to create a quick private class/structure within that lets you pass three different values to the UserState object of the Asynchronous method. This makes sense.
But there I am trying to find a non-external method of creating a zip file. I could use the Shell32 method, creating the quick byte header of a zip file and then linking a Shell32.Folder object to it, and moving the files into that folder uses the Shell32 for XP to "zip" it. Or, to use a .Net method I could use the IO.Packages.ZipPackage found in the WindowsBase.dll.
However, the Shell32 method requires the Interop.Shell32.dll file to be included with my application, which i find annoyingly redundant with regards to COM and it's design, which with any other language framework that utilizes it doesn't require an "interim" dll to interface with the default dll. I can understand using that interim dll for type checking during development, but once the app is compiled it should just link directly to shell32.dll in the system directory.
Additionally the IO.Packages.ZipPackage works great, is completely internal so no additional assemblies need to be included with my application, but on the other side of annoying it adds this [Contenttypes].xml file to every zip it creates which could be confusing to those who end up having to extract the useful files from the Zip file.