private static string ExpandEnvironmentVariablesCore(string name)
{
int currentSize = 100;
StringBuilder result = StringBuilderCache.Acquire(currentSize); // A somewhat reasonable default size
result.Length = 0;
int size = Interop.Kernel32.ExpandEnvironmentStringsW(name, result, currentSize);
if (size == 0)
{
StringBuilderCache.Release(result);
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
while (size > currentSize)
{
currentSize = size;
result.Capacity = currentSize;
result.Length = 0;
size = Interop.Kernel32.ExpandEnvironmentStringsW(name, result, currentSize);
if (size == 0)
{
StringBuilderCache.Release(result);
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
}
return StringBuilderCache.GetStringAndRelease(result);
}