我正在尝试为SSMS 2008和/或2008 R2创建一个加载项,但我马上就遇到了问题。
我可以让我的加载项工作,并在SSMS启动时让它只显示一个消息框。
但是,在下载各种代码示例后,在尝试引用Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache时,我得到一个空引用异常:
Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands;
使用SSMS 2008或SSMS 2008 R2时遇到此问题。我正在研究Visual Studio 2010。
这有点令人沮丧,因为我很想了解更多有关SSMS加载项的信息,但似乎无法通过那里的几个样本。
任何建议/提示表示赞赏。
由于
答案 0 :(得分:5)
Karl,我不知道你的具体问题,但回答另一个问题,我遇到了一堆关于编写SSMS插件的文章和链接 - 也许其中一个对你有用:
有些信息可以在这里找到:
答案 1 :(得分:3)
ServiceCache是不可靠的 - 从版本到版本它支持越来越少,可能会在某些时候消失。
如果您编写SSMS加载项,则可以通过访问VS ApplicationModel来访问内部。 这样的事情:
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_addInInstance = (AddIn)addInInst;
_applicationObject = _addInInstance.DTE as DTE2;
_applicationObject有命令和其他有趣的东西。
请注意,OnConnection的应用程序参数传入的对象不正确。这就是为什么必须使用此行来获取正确的对象: _applicationObject = _addInInstance.DTE为DTE2;
答案 2 :(得分:1)
我一直在努力解决这个问题。
我有一个加载项在sql 2008中有用 - 用VS2008编写。
我将项目升级到VS2010并开始致力于使sql 2008 r2加载项正常工作 - 我无法将这项工作用于爱情或金钱。
我尝试了很多不同的东西; *删除并重新添加所有引用。 *改变目标框架。 不是香肠。
什么都没有用...... 直到我回到VS2008 - 我做了改变。 (参见Jonathan Kehayias博客:https://www.sqlskills.com/blogs/jonathan/sql-server-2012-extended-events-add-in-to-manage-2008r2-instances/)
欢迎新版本!!
答案 3 :(得分:1)
好的我找到解决方案,问题出在CLR2.0和CLR 4.0之间
来源:http://blogs.msdn.com/b/mshneer/archive/2010/03/19/com-shim-wizards-for-vs-2010.aspx
调试以CLR 2.0为目标的加载项 Visual Studio 2010
我在调试加载项时遇到了一些问题 如果那些是在CLR 2.0加载。一世 将按F5,Excel将启动 而我的加载项会运行但是 断点没有受到打击。所以我 想要分享正在发生的事情 如何在这样的环境中设置你的环境 F5体验的方式不是 彻底破碎了。
我通常没有魔法 去调试共享加载项 - 要么是shimmed,要么是不加掩饰。我订了一个 OnConnection方法中的断点 在Connect.cs文件中,打开项目 属性,转到Debug部分, 选择“启动外部程序” 选项并设置我的完整路径 Office应用程序(例如“C:\ Program 文件\微软 Office \ Office12 \ EXCEL.EXE“)。接下来我 右键单击中的项目节点 Solution Explorer并选择“Set As 启动项目“。当我按F5我的 断点被击中。
在Visual Studio 2010中的断点 如果我的加载项被加载,则不会被命中 CLR 2.0。发生了什么事 调试器无法连接到CLR 4.0 和CLR 2.0 - 它实际上需要 事先知道是否应该 使用CLR 2.0调试引擎或 CLR 4.0调试引擎。当你 按F5调试器尝试猜测哪个 CLR将在此过程中启动。 启发式是基于阅读 EXE的.config文件,如果需要 运行时版本是u8sually指定的 如果找不到.config文件 比调试器启动CLR 4.0 调试引擎。众所周知 Office应用程序不受约束 任何特定版本的CLR都是如此 启发式失败了。
实际上有两种处理方式 有了它 - 一个是放一个 .exe.config文件旁边 the.exe本身,例如调试时 Excel 2007我将创建 Excel.exe.config并将其保留在 “C:\ Program Files \ Microsoft Office \ Office12“文件夹。
但我首选的处理方式 这是不同的。在解决方案中 资源管理器我会右键单击我的 解决方案节点并选择“添加” - > “现有项目”并开放 “C:\ Program Files \ Microsoft Office \ Office12 \ EXCEL.EXE“。接下来,我 将右键单击这个新添加的 项目并选择“设置为启动 项目“。接下来,我将打开 这个项目的属性和意志 将“Debugger Type”属性设置为 “管理(v2.0,v1.1,v1.0)”。现在我 将F5和我设定的断点 将触及OnConnection方法。
答案 4 :(得分:0)
我遇到了同样的问题。我认为这是框架
的喜欢使用Framework 3.5
ServiceCache.ExtensibilityModel不为空
使用Framework 4.0
“ServiceCache.ExtensibilityModel”是 空
答案 5 :(得分:0)
好的,谢谢你这样,但如果我在Framework 3.5中有一个项目,那么VS2010并没有停留在我的断点上。 但如果我将Framework更改为4,VS2010将在断点处停止。但是CreateToolWindow2会引发一个异常,因为它不是同一个框架!
我将代码简化为最小化:
/// <summary>Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary>
/// <param term='application'>Root object of the host application.</param>
/// <param term='connectMode'>Describes how the Add-in is being loaded.</param>
/// <param term='addInInst'>Object representing this Add-in.</param>
/// <seealso class='IDTExtensibility2' />
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_addInInstance = (AddIn)addInInst;
_applicationObject = (DTE2)_addInInstance.DTE;
if (connectMode == ext_ConnectMode.ext_cm_Startup)//ext_ConnectMode.ext_cm_UISetup)
{
}
}
/// <summary>Implements the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification that the host application has completed loading.</summary>
/// <param term='custom'>Array of parameters that are host application specific.</param>
/// <seealso class='IDTExtensibility2' />
public void OnStartupComplete(ref Array custom)
{
Windows2 win2 = this._applicationObject.Windows as Windows2;
if (win2 != null)
{
Assembly asm = Assembly.GetExecutingAssembly();
AddIn addinobj;
addinobj = this._applicationObject.AddIns.Item(1);
object controlObject = null;
Guid id = new Guid("4c410c93-d66b-495a-9de2-99d5bde4a3b9"); // this guid doesn't seem to matter?
//Window
Window windowTool = win2.CreateToolWindow2(addinobj,
asm.Location,
"MyAddinASupp.UserControl1", "Zone de test",
"{" + id.ToString() + "}",
ref controlObject);
windowTool.Visible = true;
}
}