Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
		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;
		}
Example #4
0
		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;
		}
Example #5
0
		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;
		}
Example #6
0
        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);
        }
Example #7
0
		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;
		}
Example #8
0
        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);
        }
Example #9
0
		public static string GetString(UnmanagedStringGetter getter)
		{
			return GetString(getter, 64, true);
		}
Example #10
0
 public static string GetString(UnmanagedStringGetter getter)
 {
     return(GetString(getter, 64, true));
 }
Example #11
0
 public static string GetString(UnmanagedStringGetter getter)
 {
     return(GetString(getter, DefaultBufferSize, true));
 }
Example #12
0
		public static string GetString(UnmanagedStringGetter getter)
		{
			return GetString(getter, DefaultBufferSize, true);
		}