Det ser ud til, at denne fil er en binær serialiseret version af Microsoft.SqlServer.Management.UserSettings.SqlStudio
klasse defineret i Microsoft.SqlServer.Management.UserSettings, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 assembly (placeret på c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll ).
Med en smule udviklingsevner (Visual Studio eller endda Powershell) kan du deserialisere denne fil til den originale klasse, finde de poster, du vil fjerne og gen-serialisere filen ud igen.
Dette skulle give dig ideen (at arbejde på en kopi af .bin-filen)...
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);
Efter Adrians spørgsmål prøvede jeg dette igen på en Win7 x64-boks ved hjælp af Visual Studio 2010. Jeg fandt den samme fejl, så efter at have gravet lidt fandt jeg ud af, at det tog en række trin at løse.
- Indstil platformsmålet til 'x86' i projektegenskaberne
- tilføj en reference til Microsoft.SqlServer.Management.SDK.SqlStudio (på min boks var dette på c:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
- tilføj en reference til Microsoft.SqlServer.Management.UserSettings (i samme mappe som den forrige)
- udfør tilpasset monteringsopløsning
Den brugerdefinerede assembly-opløsning tog lidt at gøre, da det ikke var indlysende (for mig, i det mindste), hvorfor CLR ikke bare ville løse assembly korrekt, og hvorfor Visual Studio ikke ville tillade mig at tilføje referencen manuelt. Jeg taler om SqlWorkbench.Interfaces.dll.
Den opdaterede kode ser sådan ud:
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);
}
}