• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

用Visual Studio 2005 开发VB.NET-C#语言转换插件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

源码:https://files.cnblogs.com/sifang2004/PasteAsCS.rar

Visual Studio插件开发

――VB.NET-C# 语言转换插件

我前段时间在《程序员》上看到一篇肖文编译的文章,说的是C#-VB 语言转换的一个Visual Studio2005 插件,当时也没有在意,因为我用的是C# ,一般情况下不会用到C#-VB 的插件。最近在网上找了些源码,比较短的那种,完成某种小功能的,但有的是VB.net 的,要么自己改成c# ,要么去一些转换网站,都觉得不是很方便。于是也有种想法了,何不依样画葫芦,来一个VB-C# 的插件呢,虽然技术含量不多,但也好了解下Visual Studio2005 中的插件开发是怎么回事了。

首先,我肯定不是自己写转换代码,那我做不到,网上基于Web 的代码转换器不少,我们可以随便找几个来用就行了,http://www.carlosag.net/Tools/CodeTranslator/Default.aspx 就是不错的一个,两种语言互转。另外就是这个http://www.kamalpatel.net/ ,其实,在我在《程序员》上看到肖文编译的那篇文章的时候,只有C#-VB 的转换,没有VB-C# 的,我当时就想,你怎么可能只支持一种呢,果不然,今天我上该网站时,它就已经出现了新的功能VB-C# 的,

看到没有,的确是新增的。但是我今天点了该链接,暂时还有点问题,估计很快就会好的了。所以比较遗憾,我没有测试它了。

创建转换器

转换器其实就是使用的上述的网站的转换器。我们可以多找几个这样的网站,这样如果一个网站暂时不可用时,或者你觉得某个网站的转换器给出的转换后的代码不是太好的时候,你就可选择其它的。也正是基于这个原因,我们为了以后能加入新的转换器,所以还是先定义一个接口为妙:

interface IConvertCode

{

string Convert(string vbCode);

string ConvertName

{

get;

}

}

代码1 :接口

Convert 方法把vb.net 的代码看成是字符串,返回的c# 代码也是字符串。ConvertName 属性返回的是转换器的名称,这样就方便选择自己喜欢的转换器。

第一个实现该接口的就是该http://www.kamalpatel.net/ 网站上的,也就是Kamal Patel 的"VB.NET to C# ", 该网站的这个功能是基于web 服务的,那就很简单了,我们就在项目中引用web 服务就OK 了。这里注意的是,因为我上面说了该功能是新增的,我写该文章的时候也用不了,它是基于web 服务的,所以它的web 服务地址我也找不到,所以现在我在代码中用的是它的"C# to VB.NET "的服务,如果什么时候它的"VB.NET to C# "可以用了,就可以很方便简单修改下就可以了。

class KPConvert : IConvertCode

{

public string Convert(string vbCode)

{

ConvertCSharp2VBService convert = new ConvertCSharp2VBService();

return convert.Execute(vbCode);

}

public string ConvertName

{

get

{

return "Kamal Patel's Converter";

}

}

}

代码2 :调用web 服务

看看就明白了,这是把C# 代码转为VB.NET 的,所以到时http://www.kamalpatel.net/ 网站上VB.NET C# 的功能正常之后,你就去上面找到对象的web 服务地址,在项目中引用,在改下该类中的相关代码就可以了。

另外一个很著名的工具就是Carlos Aguilar Mares 的基于ajax 的代码转换器,http://www.carlosag.net/Tools/CodeTranslator/Default.aspx 这是它的网站,它早就实现了C# VB.NET 之间的互转功能。它这儿,代码是以表单域集合传给carlosag.net/Tools/CodeTranslator/translate.ashx 。代码3 就是它的实现:

class CAConvert : IConvertCode

{

public string Convert(string vbCode)

{

NameValueCollection formFields = new NameValueCollection();

formFields.Add("code", vbCode);

formFields.Add("Language", "VB");

formFields.Add("DestinationLanguage", "C#");

WebClient client = new WebClient();

return Encoding.ASCII.GetString(client.UploadValues("http://www.carlosag.net/Tools/CodeTranslator/translate.ashx", "post", formFields));

}

public string ConvertName

{

get

{

return "Carlos Aguilar's Converter";

}

}

}

代码3 :使用基于表单的转换器

创建插件工程

现在就要为Visual Studio 2005 创建插件了。我们可以在解决方案里,添加一个新的插件工程来创建插件,这在扩展(Extensibility )项目里,已经含有预制的模板(注意:我看代码量不多,又比较简单所以我的源码是把转换代码和插件工程混在一起了,应该是把转换的单独建立一个工程,再插件一个工程,这样就比较清楚点




2. 创建插件工程

这个向导让你很轻松就帮你建好了该插件工程。与Visual Studio 2003 不一样,Visual Studio 2005 的插件工程包含可以将插件正确连接到开发环境的基本代码。这个插件类实现了IExtensiblity2 接口,它可以使Visual Studio 与插件进行通信。要注意的一些关键方法是,

Onconnection QueryStatus

其实你这时就可以按F5 启动项目了,但是插件默认是在"Tools "菜单中的,我要把它放在Edit 菜单的Paste 项之后,这就得改Onconnection 方法了,这个你用默认的文件跟我的这个文件比较后,你就应该明白很多东西了。

对这个方法有些重要的修改之处。首先,这个工程包含了一个含有多种语言的顶级Visual Studio 菜单项,名为CommandBar 的文本文件。下面这行代码就是定位一个双字节母语名称的菜单项。

editMenuName = resourceManager.GetString(resourceName);

如果是设置为U.S.English 的计算机上运行,它会在CommandBar.resx 文件中查找名为enEdit 的源字符串,如果是简体中文的,它就会找zh-CHSEdit 的源字符串。

需要详细的了解修改之处,你必须仔细看下修改后的Onconnection 方法了。

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)

{

_applicationObject = (DTE2)application;

_addInInstance = (AddIn)addInInst;

if(connectMode == ext_ConnectMode.ext_cm_UISetup)

{

object []contextGUIDS = new object[] { };

Commands2 commands = (Commands2)_applicationObject.Commands;

string editMenuName;

try

{

ResourceManager resourceManager = new ResourceManager("PasteAsCSharp.CommandBar", Assembly.GetExecutingAssembly());

CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);

string resourceName = string.Empty;

if (cultureInfo.Name == "zh")

{

resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "-CHSEdit");

}

else

{

resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Edit");

}

editMenuName = resourceManager.GetString(resourceName);

}

catch

{

editMenuName = "Edit";

}

Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

CommandBarControl editControl = menuBarCommandBar.Controls[editMenuName];

CommandBarPopup editPopup = (CommandBarPopup)editControl;

try

{

Command command = commands.AddNamedCommand2(_addInInstance, "PasteAsCSharp", "Paste as CSharp", "Executes the command for PasteAsCSharp", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

if((command != null) && (editPopup != null))

{

command.AddControl(editPopup.CommandBar, 12);

}

}

catch(System.ArgumentException)

{

}

}

}

代码3 :修改后的Onconnection 方法。

这里请稍微注意一点,

if (cultureInfo.Name == "zh")

{

resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "-CHSEdit");

}

else

{

resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Edit");

}

按理来所,这里根本就不要这么写的,就用else 里面代码就可以了,但是在我前段时间的中文版的Visual Studio 2005 就有问题,因为简体中文是zh-CHS ,这样它加上"Edit "就是正确的了,zh-CHSEdit, 但我的却是"zh ",所以加上"Edit "后,就成了"zhEdit ",这样就定位不到正确的资源了,如果你不知道我在说什么,你看看CommandBar.resx 文件就明白了

下面的代码定位实际的菜单对象:

CommandBarControl editControl = menuBarCommandBar.Controls[editMenuName];

CommandBarPopup editPopup = (CommandBarPopup)editControl;

一旦菜单栏定位好了,新的Paste as CSharp 菜单就能被添加进来。这一步可以通过创建一个Command 对象来实现,然后把Command 添加进菜单就可以了。

这里要注意的是,AddNameCommand2 这个方法的第二参数不能随便改动的,第三个是可以改动,它是显示在菜单项上的文本。

Command command = commands.AddNamedCommand2(_addInInstance, "PasteAsCSharp", "Paste as CSharp", "Executes the command for PasteAsCSharp",


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap