Có vẻ như tệp này là phiên bản được tuần tự hóa nhị phân của Microsoft.SqlServer.Management.UserSettings.SqlStudio
được định nghĩa trong Microsoft.SqlServer.Management.UserSettings, Version =10.0.0.0, Culture =neutral, PublicKeyToken =89845dcd8080cc91 assembly (nằm tại c:\ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.Management.UserSettings.dll ).
Với một chút kỹ năng phát triển (Visual Studio hoặc thậm chí Powershell), bạn có thể giải mã hóa tệp này thành lớp gốc, tìm các mục bạn muốn xóa và tuần tự hóa lại tệp.
Điều này sẽ cung cấp cho bạn ý tưởng (làm việc trên một bản sao của tệp .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);
Sau câu hỏi của Adrian, tôi đã thử lại điều này trên hộp Win7 x64 bằng Visual Studio 2010. Tôi đã tìm thấy lỗi tương tự, sau khi tìm hiểu kỹ một chút, tôi thấy cần thực hiện một số bước để giải quyết.
- Đặt mục tiêu Nền tảng thành 'x86' trong các thuộc tính của dự án
- thêm một tham chiếu đến Microsoft.SqlServer.Management.SDK.SqlStudio (trên hộp của tôi, đây là tại c:\ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.Management .Sdk.SqlStudio.dll)
- thêm một tham chiếu đến Microsoft.SqlServer.Management.UserSettings (trong cùng một thư mục ở thư mục trước)
- thực hiện độ phân giải lắp ráp tùy chỉnh
Độ phân giải lắp ráp tùy chỉnh mất một chút công việc vì không rõ ràng (ít nhất là đối với tôi) tại sao CLR không chỉ giải quyết hợp ngữ một cách chính xác và tại sao Visual Studio không cho phép tôi thêm tham chiếu theo cách thủ công. Tôi đang nói về SqlWorkbench.Interfaces.dll.
Mã được cập nhật trông giống như sau:
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);
}
}