Ответ 1
Похоже, что этот файл представляет собой двоичную сериализованную версию класса Microsoft.SqlServer.Management.UserSettings.SqlStudio
, определенную в сборке Microsoft.SqlServer.Management.UserSettings, Version = 10.0.0.0, Culture = neutral, PublicKeyToken = 89845dcd8080cc91 (находится в каталоге c:\Program Файлы \Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll).
С небольшим количеством навыков разработки (Visual Studio или даже Powershell) вы можете десериализовать этот файл в исходном классе, найти записи, которые хотите удалить, и повторно сериализовать файл.
Это должно дать вам идею (работа с копией файла .bin)...
var binaryFormatter = new BinaryFormatter();
var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
{
ServerTypeItem serverTypeItem = pair.Value;
List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
foreach (ServerConnectionItem server in serverTypeItem.Servers)
{
if (server.Instance != "the server you want to remove")
{
continue;
}
toRemove.Add(server);
}
foreach (ServerConnectionItem serverConnectionItem in toRemove)
{
serverTypeItem.Servers.RemoveItem(serverConnectionItem);
}
}
MemoryStream outStream = new MemoryStream();
binaryFormatter.Serialize(outStream, settings);
byte[] outBytes = new byte[outStream.Length];
outStream.Position = 0;
outStream.Read(outBytes, 0, outBytes.Length);
File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);
После вопроса Adrian, я попробовал это снова в окне Win7 x64 с использованием Visual Studio 2010. Я нашел ту же ошибку, поэтому, после того, как я выкопал бит, я обнаружил, что для его решения потребовалось несколько шагов.
- Установите целевую платформу платформы "x86" в свойствах проекта.
- добавить ссылку на Microsoft.SqlServer.Management.SDK.SqlStudio(в моем блоке это было в c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.Sdk.SqlStudio.dll)
- добавьте ссылку на Microsoft.SqlServer.Management.UserSettings(в том же каталоге на предыдущем)
- выполнить пользовательское разрешение сборки
Разрешение пользовательской сборки заняло немного времени, поскольку это было не очевидно (по крайней мере для меня), почему CLR не просто правильно разрешит сборку и почему Visual Studio не позволит мне добавить ссылку вручную, Я говорю о SqlWorkbench.Interfaces.dll.
Обновленный код выглядит следующим образом:
internal class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
var binaryFormatter = new BinaryFormatter();
var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
{
ServerTypeItem serverTypeItem = pair.Value;
List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
foreach (ServerConnectionItem server in serverTypeItem.Servers)
{
if (server.Instance != "the server you want to remove")
{
continue;
}
toRemove.Add(server);
}
foreach (ServerConnectionItem serverConnectionItem in toRemove)
{
serverTypeItem.Servers.RemoveItem(serverConnectionItem);
}
}
MemoryStream outStream = new MemoryStream();
binaryFormatter.Serialize(outStream, settings);
byte[] outBytes = new byte[outStream.Length];
outStream.Position = 0;
outStream.Read(outBytes, 0, outBytes.Length);
File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Debug.WriteLine(args.Name);
if (args.Name.StartsWith("SqlWorkbench.Interfaces"))
{
return Assembly.LoadFrom(@"C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbench.Interfaces.dll");
}
return Assembly.Load(args.Name);
}
}