可以';t用单声道压缩

本文关键字:声道 压缩 单声道 可以 | 更新日期: 2023-09-27 18:28:34

我正试图用mono压缩一些数据,如下所示:

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"。没有内部异常。这是怎么回事?

Stacktrace:

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)

可以';t用单声道压缩

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

因此,要永久解决,请删除所有MonoPosixHelper.dll文件,使其使用libMonoPosixMHelper.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(如果它还不存在,则创建)或到C:'Program Files (x86)'Mono'etc'mono'config 的全局Mono配置

我自己测试过,得到了一个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库。它是一个纯托管库,没有本机代码依赖关系。我在单机版、网络版、安卓版和iOS版中使用过这个库,没有任何问题。