LINUX.ORG.RU

Unicode и портирование приложений


0

1

Добрый день.

Программа написан на C# под Windows. При за пуске этой программы на Ubuntu под Mono частично теряется функциональность. После изучения проблемы, обнаружено, часть кода программы завязана на Win API.

Решение проблемы - убрать системно-зависимый код из программы. Но есть маленький нюанс - не все вещи можно безболезненно выкинуть из кода. Например, использование

        [DllImport("usp10.dll")]
        private static extern int ScriptItemize(
            [MarshalAs(UnmanagedType.LPWStr)] string pwcInChars, int cInChars, int cMaxItems,
            ref SCRIPT_CONTROL psControl, ref SCRIPT_STATE psState, [In, Out] SCRIPT_ITEM[] pItems, ref int pcItems);
        [DllImport("usp10.dll")]
        private static extern int ScriptLayout(
            int cRuns,[MarshalAs(UnmanagedType.LPArray)] byte[] pbLevel,
            [MarshalAs(UnmanagedType.LPArray)] int[] piVisualToLogical,
            [MarshalAs(UnmanagedType.LPArray)] int[] piLogicalToVisual);
        [DllImport("usp10.dll")]
        private static extern int ScriptShape(
            IntPtr hdc, ref IntPtr psc, [MarshalAs(UnmanagedType.LPWStr)] string pwcChars,
            int cChars, int cMaxGlyphs, ref SCRIPT_ANALYSIS psa,
            [Out, MarshalAs(UnmanagedType.LPArray)] ushort[] pwOutGlyphs,
            [Out, MarshalAs(UnmanagedType.LPArray)] ushort[] pwLogClust,
            [Out, MarshalAs(UnmanagedType.LPArray)] SCRIPT_VISATTR[] psva, ref int pcGlyphs);
        [DllImport("usp10.dll")]
        private static extern int ScriptPlace(
            IntPtr hdc, ref IntPtr psc, [MarshalAs(UnmanagedType.LPArray)] ushort[] pwGlyphs,
            int cGlyphs, [MarshalAs(UnmanagedType.LPArray)] SCRIPT_VISATTR[] psva,
            ref SCRIPT_ANALYSIS psa, [MarshalAs(UnmanagedType.LPArray)] int[] piAdvance,
            [Out, MarshalAs(UnmanagedType.LPArray)] GOFFSET[] pGoffset, ref ABC pABC);
        [DllImport("usp10.dll")]
        private static extern uint ScriptRecordDigitSubstitution(uint lcid, ref SCRIPT_DIGITSUBSTITUTE psds);
        [DllImport("usp10.dll")]
        private static extern int ScriptApplyDigitSubstitution(
            ref SCRIPT_DIGITSUBSTITUTE psds, ref SCRIPT_CONTROL psc, ref SCRIPT_STATE pss);

Как можно отсюда увидеть, программа активно использует методы работы с юникодом библиотеки Uniscribe. Что мы знаем об Юникоде? Аналог Uniscribe для POSIX систем - Pango. Но Uniscribe и Pango API совершенно различны. Что делать?

В сети находится вот такая интересная библиотека из Wine: usp10.dll.so. Как думаете, реально ли использовать её из C# приложения?

★★★

Ответ на: комментарий от alman

> Спасибо всем ответившим.

Всегда рад помочь. Обращайся, если что.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.