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

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)

その理由は、MonoPosixHelper.dll 内で定義する必要がある外部メソッドである CreateZStream 関数にあるようです。

CreateZStream は次のように宣言されています。

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

ただし、「MonoPosixHelper.dll」というファイルは存在しません。CreateZStream のエントリ ポイントを実装しているように見える libMonoPosixHelper.dylib がありますが、これは Mac 用のライブラリです。

個人的には、ほとんどの実装がネイティブ コード ライブラリをラップするだけなので、Unity のほとんどの圧縮コード/ライブラリで悪い経験をしました。互換性ページによると、クラスはサポートされていますが、マネージ部分のみが実装されているようです。これもそれを証明しているようです。

多くのプロジェクトでSharpZipLibライブラリをうまく使用してきました。これは、ネイティブ コードに依存しない純粋なマネージド ライブラリです。このライブラリをスタンドアロン、Web、Android、および iOS ビルドで問題なく使用しました。

于 2014-10-31T05:17:09.977 に答える