7

我正在尝试像这样以单声道压缩一些数据:

public static string Save(FlightProgram program, bool compressed)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter f = new BinaryFormatter();
        if (compressed)
        {
            using (DeflateStream gz = new DeflateStream(ms, CompressionMode.Compress))
            {
                f.Serialize(gz, program);
            }
        }
        else
        {
            f.Serialize(ms, program);
        }
        return Convert.ToBase64String(ms.ToArray()).Replace('/', '_');
    }
}

我只是得到异常“CreateZStream”。没有内在的例外。这里发生了什么 ?

堆栈跟踪:

Could not save flight program: CreateZStream at   at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
    at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode) [0x00000] in <filename unknown>:0 
    at KSPComputerModule.ProgramSerializer.Save (KSPComputer.FlightProgram program, Boolean compressed) [0x00000] in <filename unknown>:0 
    at KSPComputerModule.FPComputer.OnSave (.ConfigNode node) [0x00000] in <filename unknown>:0  (State: None)
4

2 回答 2

6

当然不再与 OP 相关......但我终于设法自己解决了这个问题。这是 Mono for Windows 部署中的一个错误。如果你MonoPosixHelper.dll从 Mono/GtkSharp 目录中删除文件,你会突然发现它起作用了。运行 Process Monitor,您可以看到它现在不是使用 mal-compiled MonoPosixHelper.dll,而是用于libMonoPosixHelper.dll正确编译的 ...。

因此,要永久解决,要么删除所有 MonoPosixHelper.dll 文件,以便它使用 libMonoPosixHelper.dll ......或者,最好使用 dllmap,添加

 <dllmap dll="MonoPosixHelper" target="libMonoPosixHelper.dll" os="windows" />

C:\Program Files (x86)\Mono\lib\mono\gac\System\4.0.0.0__b77a5c561934e089\System.dll.config(如果它不存在则创建)或到全局 Mono 配置C:\Program Files (x86)\Mono\etc\mono\config

于 2015-10-05T22:22:11.977 回答
5

我自己测试过,我得到了一个 DllNotFoundException:

System.DllNotFoundException: MonoPosixHelper
  at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode)

原因似乎是 CreateZStream 函数,它是一个外部方法,应该在 MonoPosixHelper.dll 中定义。

CreateZStream 被声明为

[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr CreateZStream(CompressionMode compress, bool gzip, DeflateStream.UnmanagedReadOrWrite feeder, IntPtr data);

但是文件“MonoPosixHelper.dll”不存在。有一个 libMonoPosixHelper.dylib 似乎实现了 CreateZStream 的入口点,但这是一个用于 mac 的库。

就我个人而言,我对 Unity 中的大多数压缩代码/库都有不好的体验,因为大多数实现只是包装了一个本机代码库。根据兼容性页面,该类是受支持的,但看起来只实现了托管部分似乎也证实了这一点。

我已经在很多项目中成功使用了SharpZipLib库。它是一个纯托管库,没有本机代码依赖项。我已经在独立、web、android 和 iOS 版本中使用了这个库,没有任何问题。

于 2014-10-31T05:17:09.977 回答