【问题标题】:Can't compress with mono?不能用单声道压缩?
【发布时间】:2014-10-30 20:22:01
【问题描述】:

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

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)

【问题讨论】:

  • 我实际上并不知道 Unity 是如何工作的,但我猜他们会查看 IL 代码并重新编译/重新链接它。也许他们不完全支持 System.IO.Compression(参见:forum.unity3d.com/threads/…

标签: c# unity3d mono deflatestream


【解决方案1】:

肯定不再与 OP 相关......但我终于设法自己解决了这个问题。这是 Mono for Windows 部署中的一个错误。如果你从 Mono/GtkSharp 目录中删除 MonoPosixHelper.dll 文件,你会突然发现它起作用了。运行进程监视器,您可以看到,它不再使用错误编译的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(如果不存在则创建)或C:\Program Files (x86)\Mono\etc\mono\config的全局Mono配置

【讨论】:

    【解决方案2】:

    我自己测试过,我得到了一个 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 中的大多数压缩代码/库都有不好的体验,因为大多数实现只是简单地包装了本机代码库。根据compatibility page,该类是受支持的,但看起来只有managed part is implementedThis one 似乎也证实了这一点。

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

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多