public static string GetString(UnmanagedStringGetter getter, uint defaultLenght, bool trim) { string managedString; IntPtr unmanagedString; uint exactLenght; // First attempt unmanagedString = Marshal.AllocHGlobal((int)defaultLenght * 2 + 2); // + 2 for terminating zero getter(defaultLenght, out exactLenght, defaultLenght > 0 ? unmanagedString : IntPtr.Zero); if (exactLenght > defaultLenght) { // Second attempt Marshal.FreeHGlobal(unmanagedString); unmanagedString = Marshal.AllocHGlobal((int)exactLenght * 2 + 2); // + 2 for terminating zero getter(exactLenght, out exactLenght, unmanagedString); } // Return managed string and free unmanaged memory managedString = Marshal.PtrToStringUni(unmanagedString, (int)exactLenght); //Console.WriteLine("Marshaled string from COM: \"" + managedString + "\" lenght=" + managedString.Length + " arrayLenght=" + exactLenght); // The API might or might not include terminating null at the end if (trim) { managedString = managedString.TrimEnd('\0'); } Marshal.FreeHGlobal(unmanagedString); return(managedString); }
public static unsafe string GetString(UnmanagedStringGetter getter, uint defaultBufferSize, bool trimNull) { string managedString; // DebugStringValue does not like buffer size of 0 defaultBufferSize = Math.Max(defaultBufferSize, 1); char[] buffer = new char[(int)defaultBufferSize]; fixed(char *pBuffer = buffer) { uint actualLength = 0; getter(defaultBufferSize, out actualLength, new IntPtr(pBuffer)); if (actualLength > defaultBufferSize) { char[] buffer2 = new char[(int)actualLength]; fixed(char *pBuffer2 = buffer2) { getter(actualLength, out actualLength, new IntPtr(pBuffer2)); managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer2), (int)actualLength); } } else { managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer), (int)actualLength); } } if (trimNull) { managedString = managedString.TrimEnd('\0'); } return(managedString); }
public static string GetString(UnmanagedStringGetter getter, uint defaultLenght, bool trim) { string managedString; IntPtr unmanagedString; uint exactLenght; // First attempt unmanagedString = Marshal.AllocHGlobal((int)defaultLenght * 2 + 2); // + 2 for terminating zero getter(defaultLenght, out exactLenght, defaultLenght > 0 ? unmanagedString : IntPtr.Zero); if(exactLenght > defaultLenght) { // Second attempt Marshal.FreeHGlobal(unmanagedString); unmanagedString = Marshal.AllocHGlobal((int)exactLenght * 2 + 2); // + 2 for terminating zero getter(exactLenght, out exactLenght, unmanagedString); } // Return managed string and free unmanaged memory managedString = Marshal.PtrToStringUni(unmanagedString, (int)exactLenght); //Console.WriteLine("Marshaled string from COM: \"" + managedString + "\" lenght=" + managedString.Length + " arrayLenght=" + exactLenght); // The API might or might not include terminating null at the end if (trim) { managedString = managedString.TrimEnd('\0'); } Marshal.FreeHGlobal(unmanagedString); return managedString; }
public static unsafe string GetString(UnmanagedStringGetter getter, uint defaultBufferSize, bool trimNull) { string managedString; // DebugStringValue does not like buffer size of 0 defaultBufferSize = Math.Max(defaultBufferSize, 1); char[] buffer = new char[(int)defaultBufferSize]; fixed(char* pBuffer = buffer) { uint actualLength = 0; getter(defaultBufferSize, out actualLength, new IntPtr(pBuffer)); if(actualLength > defaultBufferSize) { char[] buffer2 = new char[(int)actualLength]; fixed(char* pBuffer2 = buffer2) { getter(actualLength, out actualLength, new IntPtr(pBuffer2)); managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer2), (int)actualLength); } } else { managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer), (int)actualLength); } } if (trimNull) managedString = managedString.TrimEnd('\0'); return managedString; }
public static unsafe string GetCorSymString(UnmanagedStringGetter getter) { // CorSym does not support truncated result - it thorws exception and does not set actualLength (even with preserve sig) // ICorDebugStringValue does not support 0 as buffer size uint actualLength; getter(0, out actualLength, IntPtr.Zero); char[] buffer = new char[(int)actualLength]; string managedString; fixed(char* pBuffer = buffer) { getter(actualLength, out actualLength, new IntPtr(pBuffer)); managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer), (int)actualLength); } managedString = managedString.TrimEnd('\0'); return managedString; }
public static string GetString(UnmanagedStringGetter getter, uint defaultLength, bool trim) { // 8M characters ought to be enough for everyone... // (we need some limit to avoid OutOfMemoryExceptions when trying to load extremely large // strings - see SD2-1470). const uint MAX_LENGTH = 8 * 1024 * 1024; string managedString; IntPtr unmanagedString; uint exactLength; if (defaultLength > MAX_LENGTH) { defaultLength = MAX_LENGTH; } // First attempt unmanagedString = Marshal.AllocHGlobal((int)defaultLength * 2 + 2); // + 2 for terminating zero try { getter(defaultLength, out exactLength, defaultLength > 0 ? unmanagedString : IntPtr.Zero); exactLength = (exactLength > MAX_LENGTH) ? MAX_LENGTH : exactLength; if (exactLength > defaultLength) { // Second attempt Marshal.FreeHGlobal(unmanagedString); // TODO: Consider removing "+ 2" for the zero unmanagedString = Marshal.AllocHGlobal((int)exactLength * 2 + 2); // + 2 for terminating zero uint unused; getter(exactLength, out unused, unmanagedString); } // TODO: Check how the trimming and the last 0 charater works // Return managed string and free unmanaged memory managedString = Marshal.PtrToStringUni(unmanagedString, (int)exactLength); //Console.WriteLine("Marshaled string from COM: \"" + managedString + "\" lenght=" + managedString.Length + " arrayLenght=" + exactLenght); // The API might or might not include terminating null at the end if (trim) { managedString = managedString.TrimEnd('\0'); } } finally { Marshal.FreeHGlobal(unmanagedString); } return(managedString); }
public static string GetString(UnmanagedStringGetter getter, uint defaultLength, bool trim) { // 8M characters ought to be enough for everyone... // (we need some limit to avoid OutOfMemoryExceptions when trying to load extremely large // strings - see SD2-1470). const uint MAX_LENGTH = 8 * 1024 * 1024; string managedString; IntPtr unmanagedString; uint exactLength; if (defaultLength > MAX_LENGTH) defaultLength = MAX_LENGTH; // First attempt unmanagedString = Marshal.AllocHGlobal((int)defaultLength * 2 + 2); // + 2 for terminating zero try { getter(defaultLength, out exactLength, defaultLength > 0 ? unmanagedString : IntPtr.Zero); exactLength = (exactLength > MAX_LENGTH) ? MAX_LENGTH : exactLength; if(exactLength > defaultLength) { // Second attempt Marshal.FreeHGlobal(unmanagedString); // TODO: Consider removing "+ 2" for the zero unmanagedString = Marshal.AllocHGlobal((int)exactLength * 2 + 2); // + 2 for terminating zero uint unused; getter(exactLength, out unused, unmanagedString); } // TODO: Check how the trimming and the last 0 charater works // Return managed string and free unmanaged memory managedString = Marshal.PtrToStringUni(unmanagedString, (int)exactLength); //Console.WriteLine("Marshaled string from COM: \"" + managedString + "\" lenght=" + managedString.Length + " arrayLenght=" + exactLenght); // The API might or might not include terminating null at the end if (trim) { managedString = managedString.TrimEnd('\0'); } } finally { Marshal.FreeHGlobal(unmanagedString); } return managedString; }
public static unsafe string GetCorSymString(UnmanagedStringGetter getter) { // CorSym does not support truncated result - it thorws exception and does not set actualLength (even with preserve sig) // ICorDebugStringValue does not support 0 as buffer size uint actualLength; getter(0, out actualLength, IntPtr.Zero); char[] buffer = new char[(int)actualLength]; string managedString; fixed(char *pBuffer = buffer) { getter(actualLength, out actualLength, new IntPtr(pBuffer)); managedString = Marshal.PtrToStringUni(new IntPtr(pBuffer), (int)actualLength); } managedString = managedString.TrimEnd('\0'); return(managedString); }
public static string GetString(UnmanagedStringGetter getter) { return GetString(getter, 64, true); }
public static string GetString(UnmanagedStringGetter getter) { return(GetString(getter, 64, true)); }
public static string GetString(UnmanagedStringGetter getter) { return(GetString(getter, DefaultBufferSize, true)); }
public static string GetString(UnmanagedStringGetter getter) { return GetString(getter, DefaultBufferSize, true); }