Wygląda na to, że ten plik jest binarną serializowaną wersją Microsoft.SqlServer.Management.UserSettings.SqlStudio
klasa zdefiniowana w Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 zestaw (znajdujący się w c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).
Przy odrobinie umiejętności programistycznych (Visual Studio lub nawet Powershell) możesz zdeserializować ten plik do oryginalnej klasy, znaleźć wpisy, które chcesz usunąć i ponownie zserializować plik.
To powinno dać ci pomysł (praca na kopii pliku .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);
Po pytaniu Adriana spróbowałem tego ponownie na komputerze Win7 x64 za pomocą Visual Studio 2010. Znalazłem ten sam błąd, więc po przekopaniu się stwierdziłem, że rozwiązanie wymagało kilku kroków.
- Ustaw docelową platformę na „x86” we właściwościach projektu
- dodaj odwołanie do Microsoft.SqlServer.Management.SDK.SqlStudio (na moim pudełku było to w c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
- dodaj odniesienie do Microsoft.SqlServer.Management.UserSettings (w tym samym katalogu co w poprzednim)
- wykonaj niestandardowe rozwiązanie zespołu
Niestandardowa rozdzielczość zestawu zajęła trochę czasu, ponieważ nie było oczywiste (przynajmniej dla mnie), dlaczego CLR po prostu nie rozwiązałby poprawnie zestawu i dlaczego Visual Studio nie pozwoliłby mi ręcznie dodać odwołania. Mówię o SqlWorkbench.Interfaces.dll.
Zaktualizowany kod wygląda tak:
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);
}
}