用自动化接口控制 Virsual Studio .NET 2003 的工具箱

原创 2004年10月11日 10:05:00
做了一套ASP.NET的自定义控件,本想把这些控件加到Virsual Studio .NET 2003 的工具箱中,看了一下MSDN,自己做代码试了一下,竟然不好使。搞了半天,查了N多资料,才知道是Virsual Studio .NET 2003的Bug,好在总算解决了。下面是源码,发出来以免大家碰到同样问题是浪费时间。

中间有几行代码可能你会觉得没必要,但如果没有,你会发现就不好用,经验之谈,希望对大家有所帮助!

控制台程序的主单元:

using System;
using EnvDTE;

namespace SuperToolboxCS
{
/// <summary>
/// ClassMain 的摘要说明。
/// </summary>
class ClassMain
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Type latestDTE = Type.GetTypeFromProgID("VisualStudio.DTE");
EnvDTE.DTE dte = Activator.CreateInstance(latestDTE) as EnvDTE.DTE;

MessageFilter.Register();

if (dte != null)
Installer.AddToolBoxTab(dte);

MessageFilter.Revoke();
}
}

sealed class Installer
{
public static void AddToolBoxTab(EnvDTE.DTE dte)
{
if (dte == null)
return;

Window win = dte.Windows.Item(EnvDTE.Constants.vsWindowKindToolbox);

ToolBox box = win.Object as ToolBox;

if (box == null)
return;

ToolBoxTabs tabs = box.ToolBoxTabs;

if (tabs == null)
return;

foreach (ToolBoxTab t in tabs)
{
if (t.Name == TabName)
t.Delete();
}

ToolBoxTab tab = tabs.Add(TabName);

if (tab == null)
return;

dte.ExecuteCommand("View.PropertiesWindow", "");

tab.Activate();
tab.ToolBoxItems.Item(1).Select();

string fullpath = LookupSuperServerObjectFileName();

if (fullpath == "")
return;

tab.ToolBoxItems.Add(@"Unused?", fullpath, vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);

System.Console.Write("SuperLib Web 窗体工具箱创建成功!");
}

private static string LookupSuperServerObjectFileName()
{
string KeyName = "";

Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine;
rk = rk.OpenSubKey(KeyName, false);

if (rk == null)
{

return "";
}

string fullpath = (string)rk.GetValue(null);
fullpath += @"/SuperLib.ServerObject.dll";

if (!System.IO.File.Exists(fullpath))
{

return "";
}

return fullpath;
}

private const string TabName = @"SuperLib Web 窗体";
private const string KeyName = @"SOFTWARE/Microsoft/VisualStudio/7.1/AssemblyFolders/SuperLibV2.4.2003";
}
}

MessageFilter 类

using System;
using System.Runtime.InteropServices;

namespace SuperToolboxCS
{
/// <summary>
/// MessageFilter 的摘要说明。
/// </summary>
public class MessageFilter : IOleMessageFilter
{
public static void Register()
{
IOleMessageFilter newfilter = new MessageFilter();

IOleMessageFilter oldfilter = null;
CoRegisterMessageFilter(newfilter, out oldfilter);
}

public static void Revoke()
{
IOleMessageFilter oldfilter = null;
CoRegisterMessageFilter(null, out oldfilter);
}

//
// IOleMessageFilter impl

int IOleMessageFilter.HandleInComingCall(int dwCallType, System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr lpInterfaceInfo)
{
System.Diagnostics.Debug.WriteLine("IOleMessageFilter::HandleInComingCall");

return 0; //SERVERCALL_ISHANDLED
}

int IOleMessageFilter.RetryRejectedCall(System.IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
{
System.Diagnostics.Debug.WriteLine("IOleMessageFilter::RetryRejectedCall");

if (dwRejectType == 2 ) //SERVERCALL_RETRYLATER
{
System.Diagnostics.Debug.WriteLine("Retry call later");
return 99; //retry immediately if return >=0 & <100
}
return -1; //cancel call
}

int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
{
System.Diagnostics.Debug.WriteLine("IOleMessageFilter::MessagePending");

return 2; //PENDINGMSG_WAITDEFPROCESS
}

//
// Implementation
[DllImport("Ole32.dll")]
private static extern int CoRegisterMessageFilter(IOleMessageFilter newfilter, out IOleMessageFilter oldfilter);
}

[ComImport(), Guid("00000016-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IOleMessageFilter // deliberately renamed to avoid confusion w/ System.Windows.Forms.IMessageFilter
{
[PreserveSig]
int HandleInComingCall(
int dwCallType,
IntPtr hTaskCaller,
int dwTickCount,
IntPtr lpInterfaceInfo);

[PreserveSig]
int RetryRejectedCall(
IntPtr hTaskCallee,
int dwTickCount,
int dwRejectType);

[PreserveSig]
int MessagePending(
IntPtr hTaskCallee,
int dwTickCount,
int dwPendingType);
}
}

同样有 VB.NET 版本的实现,不贴了。
需要发消息。

QQ:12150367
EMAIL:haozidong@126.com

http://www.playicq.com/dispdocnew.php?id=21417

参考 BLOG:
http://weblogs.asp.net/savanness/archive/2003/04/24/6012.aspx
http://weblogs.asp.net/savanness/archive/2003/04/15/5701.aspx
http://weblogs.asp.net/savanness/archive/2003/04/10/5352.aspx
http://weblogs.asp.net/savanness/archive/2003/03/18/4019.aspx

控制 Virsual Studio .NET 开发环境

    作 SuperLib 构件安装程序时,碰到了几个麻烦。主要是要完成几个功能:在 Virsual Studio .NET 中添加向导以引导使用者完成一些简单工作;向 Virsual Studio...
  • haozidong
  • haozidong
  • 2004年10月19日 16:39
  • 741

Visual Studio .NET 2003开发环境

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不...
  • msdnlu
  • msdnlu
  • 2007年07月12日 09:17
  • 1169

virsual studio 使用

一:文件的建立 选择“文件->新建->项目” 这里注意的一点就是:一个项目中,可以有多个源文件,互不影响。二:调试当有出现问题时候,在左上方选择 :视图-》错误列表 就可以在...
  • qq_36502045
  • qq_36502045
  • 2017年04月27日 21:20
  • 265

VisualStudio.NET2003下载地址

VisualStudio.NET2003,它是Microsoft的第二代开发工具,用于构建和部署功能强大而安全的连接Microsoft.NET的软件。 下载地址中有Visual Studio ....
  • vbLittleBoy
  • vbLittleBoy
  • 2014年08月23日 11:46
  • 5661

Visual Studio .Net 2003 的安装

Q:安装Visual Studio .Net 2003,结果出现提示:“安装程序检测到另一个程序要求计算机重新启动.必须重新启动计算机后才能安装visual studio.net系统必备.系统重新启动...
  • Elysium
  • Elysium
  • 2006年09月01日 13:15
  • 9650

MSDN Library Visual Studio .NET 2003 简体中文版(ISO) 免费下载

       MSDN Library Visual Studio .NET 2003 简体中文版(ISO)  CD1      MSDN Library Visual Studio .NET 200...
  • ddl007
  • ddl007
  • 2006年04月09日 21:58
  • 9300

Visual Studio 各版本区别及下载

Visual Studio 各版本区别: 从1998年的 6.0 到现在的 2010 Ultimate 如何注册和获得以及购买许可 VS101 2010-07-08 04:33:59 阅读1072 ...
  • wisage
  • wisage
  • 2011年05月31日 09:28
  • 4370

如何删除 Visual Studio .NET 2003

如何删除 Visual Studio .NET 2003本文分步介绍了可以用来从您的计算机中删除 Microsoft Visual Studio .NET 2003 的两种方法。使用“添加或删除程序”...
  • ljc_zy
  • ljc_zy
  • 2006年03月13日 20:57
  • 1363

在 Visual Studio .NET 中自动化生成和配置

在 Visual Studio .NET 中自动化生成和配置Kemp BrownVisual Studio TeamMicrosoft Corporation 2002 年 2 月摘要:本文介绍了如何...
  • hudan
  • hudan
  • 2005年03月26日 01:25
  • 1823

VisualStudio2003 下载地址

VisualStudio2003  下载地址http://www.ivdown.com/ShowContent.aspx?id=1546&pid=4&cid=36 msdn2003帮助文件下载地址 ...
  • xqf222
  • xqf222
  • 2006年09月25日 21:21
  • 2055
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用自动化接口控制 Virsual Studio .NET 2003 的工具箱
举报原因:
原因补充:

(最多只允许输入30个字)