Добрый день.
Программа написан на 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# приложения?