看起来这文件是在Microsoft.SqlServer.Management.UserSettings定义的Microsoft.SqlServer.Management.UserSettings.SqlStudio
类的二进制序列化版本,版本= 10.0.0.0,文化=中性公钥= 89845dcd8080cc91组件(位于C: \ Program Files \ 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);
阿德里安的问题后,我使用Visual Studio 2010年我再次尝试这个在Win7的X64箱发现了同样的错误,所以挖了一下后,我发现它需要一些步骤来解决。
- 设置目标平台为“86”在项目属性
- 添加引用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);
}
}
Microsoft无法将其作为XML文件吗?那会有多难? :( 那么,因为我会失去*每个*定制和*所有*项目,我想我什至不想再这样做 – 2011-06-03 19:20:21
是的,很臭,我查找有关SqlStudio.bin格式/可编辑性的信息,但找不到任何东西。唉。 – 2011-06-03 19:51:07
为了将来对这个问题的参考,我编辑了你的答案,以便读者知道前面它不能完成,然后提供替代解决方案,然后我接受了。 – 2011-06-03 19:59:25