diff --git a/configure.in.in b/configure.in.in index a8a562f95..dde7bce7c 100644 --- a/configure.in.in +++ b/configure.in.in @@ -106,9 +106,19 @@ OFF_T_FLAGS="-define:OFF_T_$ac_cv_sizeof_off_t" AC_SUBST(OFF_T_FLAGS) MONO_REQUIRED_VERSION=1.0 +FIRST_MONO_VERSION_WITH_NET_4_6_SUPPORT=4.4 PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) if test "x$has_mono" = "xfalse" ; then PKG_CHECK_MODULES(MONO_DEPENDENCY, mono-2 >= $MONO_REQUIRED_VERSION, has_mono=true, has_mono=false) + if test "x$has_mono" = "xtrue" ; then + PKG_CHECK_MODULES(MONO_DEPENDENCY, mono-2 >= $FIRST_MONO_VERSION_WITH_NET_4_6_SUPPORT, NET_4_6_SUPPORT=true, NET_4_6_SUPPORT=false) + fi +else + PKG_CHECK_MODULES(MONO_DEPENDENCY, mono >= $FIRST_MONO_VERSION_WITH_NET_4_6_SUPPORT, NET_4_6_SUPPORT=true, NET_4_6_SUPPORT=false) +fi + +if test "x$platform_win32" = "xyes"; then + NET_4_6_SUPPORT=true fi AC_PATH_PROG(GACUTIL, gacutil, no) @@ -224,6 +234,9 @@ AM_CONDITIONAL(ENABLE_MONOGETOPTIONS, test "x$has_mono" = "xtrue") CSFLAGS="$DEBUG_FLAGS $CSDEFINES $WIN64DEFINES -unsafe" +if test "x$NET_4_6_SUPPORT" = "xtrue" ; then + CSFLAGS="$CSFLAGS -define:HAVE_NET_4_6" +fi PKG_CHECK_MODULES(GLIB_2_31, glib-2.0 >= 2.31, HAVE_GLIB_2_31_OR_HIGHER=yes, HAVE_GLIB_2_31_OR_HIGHER=no) diff --git a/glib/Marshaller.cs b/glib/Marshaller.cs index d20b9c186..c18c3ba55 100644 --- a/glib/Marshaller.cs +++ b/glib/Marshaller.cs @@ -78,29 +78,23 @@ public static string FilenamePtrToStringGFree (IntPtr ptr) [DllImport("glibsharpglue-2", CallingConvention=CallingConvention.Cdecl)] static extern UIntPtr glibsharp_strlen (IntPtr mem); - - static string Utf8PtrToStringFast (IntPtr ptr, int len) - { - unsafe - { - var p = (byte*)ptr; - return System.Text.Encoding.UTF8.GetString (p, len); - } - } - - static bool hasFastGetStringOverload = typeof (System.Text.Encoding).GetMethod ("GetString", new [] { typeof (byte*), typeof (int) }) != null; public static string Utf8PtrToString (IntPtr ptr) { if (ptr == IntPtr.Zero) return null; int len = (int) (uint)glibsharp_strlen (ptr); - if (hasFastGetStringOverload) - return Utf8PtrToStringFast (ptr, len); - +#if HAVE_NET_4_6 + unsafe + { + var p = (byte*)ptr; + return System.Text.Encoding.UTF8.GetString (p, len); + } +#else byte [] bytes = new byte [len]; Marshal.Copy (ptr, bytes, 0, len); return System.Text.Encoding.UTF8.GetString (bytes); +#endif } public static string[] Utf8PtrToString (IntPtr[] ptrs) {