1. 苏葳的备忘录首页
  2. 开发工具

BuildVersionIncrement插件80070057错误的修复

c#  visual studioBuildVersionIncrement是国外爱好者开发的一个在visual studio环境下自动增加版本号的插件。众所周知MS顽固的没有在vs中提供这个功能。虽有变通的方法,比如把AssemblyInfo.cs中的版本号改为1.0.*等,但并不方便。而BuildVersionIncrement则提供了相当强大的控制与自定义功能,在微软不再装聋作哑之前,自动版本号工具里这个插件可谓是不二之选。

BuildVersionIncrement插件作者原本只为vs 2005和2008开发,后来应要求更新至vs 2010,但目前仍是测试版,不过据国外论坛反馈使用效果不错,甚至有人更改BuildVersionIncrement.addin中的版本号后中,在vs 2012和2013中测试通过。因为需要这个功能,下载了BuildVersionIncrement v2.5 beta版,安装到虚拟机上的xp里的vs2010上使用试试,结果悲剧了,vs2010启动时,报个8xxxxx 错误,无法加载插件。经查,是因为本人虚拟机上项目文件夹在远程映射盘上的缘故,将插件的addins目录改为本地目录可解决问题,也可在common7下的IDE目录里,将devenv.exe.config里增加一条配置项,允许使用远程文件来解决,本人用第二种方法解决,此处暂且不提。解决上面问题后,再启动vs 2010,却又报个80070057错误。这个头疼了,因为搜了许久,只找到一个相关回贴,该土耳其小伙也遇到此问题,由于BuildVersionIncrement提供开源代码,所以他自已解决了。问题原因是某个函数由于本地化语言问题,没取到正确的“工具”菜单项名称导致。

无奈也去下载了BuildVersionIncrement v2.5的源码,解压缩,打开工程。以前从未开发过visual studio的addin工程。摸索熟悉了一下,大致知道addin项目的启动从OnConnection函数开始,大致相当于main函数。vs的插件,放在addins目录下,一个配置文件和一个dll。配置文件中指定了dll的文件名及路径,所以插件dll本身其实可以在任何目录的。LoadBehavior tag指出启动的方式 比如0和2是不加载,1是加载等等,由于可以是组合值,所以回头可详细研究。插件vsi文件的安装,其实就是把两个文件拷入addins目录而已,若要卸载,也只要删除这两文件即可。首先想到的是配置个调试环境,来定位报错,结果折腾2个小时,未配成功,也可能是某些操作步骤不对,始终无法进入调试代码。从源码的设置来看,原作者是配置的有调试项目的,但环境什么的与本人机器有较大区别,也不理会了,无心恋战,用笨办法打印日志来调吧。尝试从OnConnection开始,有引入windows.Form的,用MessageBox显示,没有的,引入System.IO,用日志文件的方式打印信息。最后终于定位到错误,果然就是该外国小伙说的地方。小伙并没说具体错误语句,此处代码如下:

private string ToolsMenuName
        {
            get
            {
                if (_toolsMenuName == null)
                {
                    try
                    {
                        Assembly asm = Assembly.GetExecutingAssembly(); // Fix me!
                        ResourceManager resourceManager = new ResourceManager(VSAddin.CommandBarResourceName, asm);
                        int localID = VSAddin.ApplicationObject.LocaleID;
                        CultureInfo cultureInfo = new System.Globalization.CultureInfo(localID);
                        string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
                        _toolsMenuName = resourceManager.GetString(resourceName);
                    }
                    catch
                    {
                        //We tried to find a localized version of the word Tools, but one was not found.
                        //  Default to the en-US word, which may work for the current culture.
                        _toolsMenuName = "Tools";
                    }
                }
                return _toolsMenuName;
            }
        }

 

经打印变量值调试,在本人中文vs2010环境下加载插件时,此函数并不会引发catch内的异常,然而在执行完之后,_toolsMenuName变量却是一个空串,这次导致插件无法定位到visual studio的”工具”菜单项。这个错误,可能是跟vs的各种本地化版本有关系,英语系的开发者也许就没有其它语种的测试环境。无论如何,将_toolsMenuName变量强制赋值为中文”工具”后,重新编译生成,问题解决。插件在简体中文vs2010可正常加载了。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/590.html

发表评论

邮箱地址不会被公开。 必填项已用*标注