VS2005在开发Addin(外接程序)时自动生成的bug

注:当前VS2008正式版只有英文版本,所以我的vs2005是中文版本,VS2008是英文版。



         我的VS2005一直无法使用Visual Studio 外接程序,也无法开发,不是写不出来,而是写出来了什么反应也没有。一直很纳闷,网上查了很多资料,没有找到解决办法。甚至于我专门花半天时间安装了VS2005 sp1。这个补丁叫个难装,430M不说,装起来贼慢贼慢的。而且如果你不会装,至少要装2-3次!为什么?要设置策略才可以装,要不然会提示个没有什么什么签名就装不下去了。当然这是我Window2003 EE sp2下的反应,其他系统不知道了就。
         不知道是不是我机器安装了VS2008的原因,我建立Visual Studio 外接程序是可以选择四个VS版本的,其中有2个是08的程序。
mm.gif

但是调试的时候就是死活没反应,我尝试把addin加到vs2008上面却出来了。

以前一直没注意,还以为VS2005下难于配置,相当于放弃了开发点自己玩玩的小工具的想法。而现在突然可以在VS2008里使用了,在05里却不能用,莫非真的是2005存在缺陷?

具体过程不说了,今天尝试调试一下,发现
    try
    {
     //若要将此命令移动到另一个菜单,则将“工具”一词更改为此菜单的英文版。
     //  此代码将获取区域性,将其追加到菜单名中,然后将此命令添加到该菜单中。
     //  您会在此文件中看到全部顶级菜单的列表
     //  CommandBar.resx.
     ResourceManager resourceManager = new ResourceManager("MyAddin1.CommandBar", Assembly.GetExecutingAssembly());
     CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
     string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
     toolsMenuName = resourceManager.GetString(resourceName);
    }
    catch
    {
     //我们试图查找“工具”一词的本地化版本,但未能找到。
     //  默认值为 en-US 单词,该值可能适用于当前区域性。
     toolsMenuName = "Tools";
    }

toolsMenuName 根本得不到值,是null。怎么回事?

     //我们试图查找“工具”一词的本地化版本,但未能找到。
     //  默认值为 en-US 单词,该值可能适用于当前区域性。

这句注释引起了我的注意,en-US ,那不是还有zh么?而我的VS是中文版本,估计就是中文版本下的问题吧。


关键是不知道要怎么设置,关键语句是
string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
构造了字符resourceName ,而这个字符 是取得toolsMenuName (= resourceManager.GetString(resourceName);)的关键要素

如果贪图方便,直接把上述代码改成
toolsMenuName = "工具";  就可以了。不过那样就又不支持英文版了。

那么改下
     //若要将此命令移动到另一个菜单,则将“工具”一词更改为此菜单的英文版。
     //  此代码将获取区域性,将其追加到菜单名中,然后将此命令添加到该菜单中。
     //  您会在此文件中看到全部顶级菜单的列表
     //  CommandBar.resx.
     ResourceManager resourceManager = new ResourceManager("MyAddin1.CommandBar", Assembly.GetExecutingAssembly());
     CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
     string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
     toolsMenuName = resourceManager.GetString(resourceName);
这部分,改成
     ResourceManager resourceManager = new ResourceManager("MyAddin1.CommandBar", Assembly.GetExecutingAssembly());
     CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
     //string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
      if(cultureInfo.TwoLetterISOLanguageName == "zh")
           toolsMenuName = "工具";
      else
            toolsMenuName = "Tools";


这样就能解决问题了。不过是只适合在中英文环境下。

我藏式用VS2008建立项目发现,2008这个地方改了。以下是2008生成的代码:
    try
    {
     //If you would like to move the command to a different menu, change the word "Tools" to the
     //  English version of the menu. This code will take the culture, append on the name of the menu
     //  then add the command to that menu. You can find a list of all the top-level menus in the file
     //  CommandBar.resx.
     string resourceName;
     ResourceManager resourceManager = new ResourceManager("MyAddin1.CommandBar", Assembly.GetExecutingAssembly());
     CultureInfo cultureInfo = new CultureInfo(_applicationObject.LocaleID);
     
     if(cultureInfo.TwoLetterISOLanguageName == "zh")
     {
      System.Globalization.CultureInfo parentCultureInfo = cultureInfo.Parent;
      resourceName = String.Concat(parentCultureInfo.Name, "Tools");
     }
     else
     {
      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";
    }
这段代码是可用的。原来05比08差在少了个判断。


原文地址:https://www.cnblogs.com/birdshover/p/1009429.html