Не можете сжать с моно?
Я пытаюсь сжать некоторые данные в моно, как это:
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)
2 ответа
Конечно, больше не относится к ОП... но мне наконец-то удалось решить эту проблему самостоятельно. Это ошибка в развертывании Mono для Windows. Если вы удалите MonoPosixHelper.dll
файлы из каталогов Mono/GtkSharp, вы вдруг обнаружите, что это работает. Запустив Process Monitor, вы можете увидеть, что вместо того, чтобы идти на скомпилированный 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
Я проверил это сам, и я получаю 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 во многих проектах. Это чисто управляемая библиотека без собственных зависимостей кода. Я использовал эту библиотеку в автономных, веб, Android и iOS-сборках без каких-либо проблем.