这似乎是一个相当普遍的问题,但我见过的答案都没有特别令人满意.我想获得本地计算机上安装的MS SQL Server实例的名称列表,无论它们是否已启动.出于本讨论的目的,我只是找到SQL 2005及更新版本的实例; 我可以使用"遗留"方法处理2000及更早版本(即查看注册表).我所要求的是它不依赖于SQL Server Browser服务(现在默认禁用),即使应用程序是32位,也会返回64位实例.
我见过的建议:
挖掘注册表:据说不推荐,因为注册表项没有记录; MS可能会在将来更改它们.更重要的是,据我所知,64位的MSSQL实例进入64位HKLM\SOFTWARE\Microsoft\Microsoft SQL Server InstalledInstances,32位实例进入32位实例,所以32-位应用程序将看不到任何64位实例.
使用上一篇博客文章中提到的SQL WMI Provider for Configuration Management.这似乎是最接近的,但尽管作者劝告避免使用注册表,因为它可能会改变,但事实证明在SQL 2005和2008之间更改了WMI命名空间:在2005年,它是root\Microsoft\SqlServer\ComputerManagement,但在2008年它是root\Microsoft\SqlServer\ComputerManagement10.它将来会再次发生变化吗?也就是说,如果我必须为未来版本的SQL更新我的应用程序,这可能不是一个大问题.
我使用WMI方法的问题是SqlService类返回服务名称列表,而我想要实例名称.例如,我只想要INSTANCE而不是MSSQL $ INSTANCE.剥离"MSSQL $"是微不足道的,处理默认实例的特殊情况也是如此,但它是否可靠?AFAIK,技术上没有理由无法重命名服务,同时保持实例名称相同.也就是说,除非有人有更好的方法,否则我认为我会接受它(获取服务名称并剥离MSSQL $).ServerSettings类返回实例名称,但它没有看到我在计算机上安装的64位SQL 2008 R2 Express实例.
使用SmoApplication.EnumAvailableSqlServers(true):这似乎取决于SQL Server Browser服务.如果浏览器服务启动它会很好,但如果不是,我只得到一行,其中计算机名称为服务器名称和空白实例名称.
使用System.Data.Sql.SqlDataSourceEnumerator.GetDataSources():相同的问题,它取决于SQL Server浏览器.
那么,还有其他一些方法可能会更好吗?
我注意到,如果我有一个 .NET Framework 4.8 程序集公开了一个采用参数的 COM 互操作方法System.Collections.ArrayList,然后从 VB6 调用该方法,则 .NET 方法将获取 的副本,而不是传递的ArrayList原始副本:在 VB6 对象与 .NET 对象上返回不同的值,并且如果 .NET 方法修改,则不会对 VB6 端的对象进行修改。ArrayListGetHashCode()ArrayList
但是,如果在 .exe.config 文件中添加一个<startup useLegacyV2RuntimeActivationPolicy="true">部分,它会按预期工作:GetHashCode()在 VB6 和 .NET 端返回相同的值,并且在 VB6 端可以看到 .NET 方法所做的修改。
为什么会出现这种情况?有没有办法让它按照我期望的方式工作而无需设置useLegacyV2RuntimeActivationPolicy="true"?(我可以将其设置为 true;我主要好奇为什么需要这样做才能使其工作)
细节:
我在 .NET 端有这个,在项目构建配置上检查了“注册 COM 互操作”。
using System.Collections;
using System.Runtime.InteropServices;
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class ItemAdder
{
public int AddItem(ArrayList ar)
{
ar.Add("def");
return ar.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
在 VB6 端,创建项目,添加对 的项目引用C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb,并将其放入模块中:
Option …Run Code Online (Sandbox Code Playgroud) 我有一个 VB.NET 项目(VB 2012,.NET Framework 4.5),我需要比较两个Objects 的相等性。具体来说,它是一些处理 ADORecordset对象的COM Interop 代码,并且 a 的Bookmark属性Recordset是一个 COM Variant,它Object在 VB.NET 中变成了 an 。
目前,我有Option Strict Off,这让我可以Object使用=运算符比较s 。但是,我想转向Option Strict On该文件,并在需要它的少数几个地方进行“松散”比较。此 MSDN 页面的“使用关系比较运算符进行无类型编程”部分解释了 VB 如何实现Objects 与之间的比较Option Strict Off,我可以编写一个函数来做同样的事情。但似乎 .NET 中某处已经实现了“松散”比较,我不想重新实现轮子。有什么东西可以做我想做的事吗?