locked
Visual Studio 精华问答集中帖 RRS feed

  • 问题

  • 大家好,我们是微软MSDN官方论坛的产品技术支持团队。

    为了更好地为大家服务,帮助大家学习微软开发技术、解决工作中的实际难题,我们将在这个帖子里更新MSDN官方论坛的精华问答列表。只要收藏这一个帖子,您就可以看到不断更新的精华问答内容!敬请期待!


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:29
    版主

全部回复

  • VSTO (Visual Studio Tools for Office)论坛的社区成员大家好,

    在过去的两个月里,我们的支持团队总结出一个VSTO FAQ。新用户会提出一些被经常问到的问题。为了更好的服务这些新用户,我们正在发布这些FAQ。接下来的链接就是问题答案的列表。事实上,这只是FAQ内容计划的开始。我们仍然在继续工作,将来会增加更多的内容。

    在这里,我要借此机会向Misha Shneerson, Mary Lee, Kris Makey, Andrew Whitechapel, Mei Liang 说声谢谢。在VSTO FAQ建立阶段,谢谢你们的时间和意见。当然,我也非常感激在VSTO论坛的MVPs的工作,比如Cindy, Sue, Helmut等等。没有你们的持续和热心的帮助,我们不可能使VSTO论坛那么的成功。非常感谢您们!

    好的,入口列表如下,

    1.  有多少个版本的Visual Studio Tools for Office  (VSTO)? 它们之间有什么区别?

    2. 共享外接程序和VSTO应用程序级外接程序之间的相同点和不同点有哪些?

    3. VSTO文档级自定义项和VSTO应用程序级外接程序有哪些不同点?

    4. 当部署一个外接程序时,在客户端上需要哪些注册表项?

    5. 如何从外部的应用程序中调用外接程序的功能?

    6. 为什么在C#源代码编辑器里Office对象模型的一些事件是不可见的?

    7. 为什么我们的命令栏中按钮的事件仅在第一次触发?

    8. 怎样建立一个非模态的窗口,Office主窗口作为它的拥有者?

    9. 当在Outlook Explorer中右击邮件时,如何向上下文菜单添加按钮?

    10. 为什么在部署后,我们的VSTO外接程序没有被加载,而在Visual Studio中调试时可以工作在开发的机器上?

    11. 怎样在Outlook 2003 主窗口中添加一个命令栏(CommandBar)和按钮(buttons)?

    12. 当自定义任务窗格是浮动的,如何获得它的位置?

    13. 如何以编程方式设置功能区的控件?

    14. 如何在没有安装Visual Studio的编制服务器上编制一个VSTO项目?

    15. 在外接程序中,如何向文档表面添加托管控件?

    16. 怎样从VSTO文档删除自定义项?

    17. 在自定义任务窗格被关闭时,是否有个类似的关闭事件可以激活的?它会被回收吗?

    18. VSTO和VSTA有什么相同点和不同点?

    19. 为什么,一旦VSTO v3外接程序或者文档被安装后,我就不能改变安装位置?

    20. 怎样通过代码激活Office 2007的功能区?

    21. 如何检测一个Office应用程序是内嵌状态?

    22. Office可以加载面向 .NET Framework不同版本的外接程序吗?

    23. 如何添加命令栏到Outlook 2007 所有的Explorers中?

    24. 如何将组添加到Word 功能区的内置选项卡中?如何将选项卡添加到内置选项卡前面?

    25. 在哪里能找到不同Office应用程序的PIA组件IDs?

    26. 如何为VSTO应用程序创建一个初始屏幕?


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:31
    版主
  • 1. 有多少个版本的Visual Studio Tools for Office (VSTO)? 它们之间有什么区别?

    随着时间的流逝,Visual Studio Tools for Office在新的版本里增强了特性和功能。下面的列表描述了四个版本的Visual Studio Tools for Office

    1. VSTO 2003(VSTO v1 runtime)支持 Excel 2003Word 2003的文档级自定义项。

    2. VSTO 2005(VSTO v2 runtime)被随附在Visual Studio 2005Professional editionVisual Studio Team System (VSTS) 2005.可以当做单独的产品安装它。这个版本的VSTO只能被用来为Word 2003Excel 2003InfoPath 2003 template项目开发文档级自定义项。在这个版本里,不支持Office 2007

    3. VSTO 2005 SE (VSTO v2 runtime)这个版本允许我们开发Office 2003Office 2007的应用程序级外接程序。它只有6.1MB我们可以从微软下载中心下载它。这个版本只支持Office 2003Office 2007应用程序级外接程序的开发。文档级自定义项目的模板不包含在内。

    4. VSTO 2008 (VSTO v3 runtime) 被随附在Visual Studio 2008 Professional Edition或者更高的版本。它包含了VSTOVSTO SE的模板,同时也提供了Office 2007文档级的项目模板。

    除了这四个版本,Visual Studio 2008 SP1也介绍VSTO的一个新特征,尽管没有带来行的项目。在以前的版本中,我们只能在文档级自定义项中向文档表面添加托管的控件。Visual Studio 2008 SP1允许外接程序利用以前只能用在文档级自定义项(比如数据绑定的ListObjectNamedRange)的特征。更多的内容,请参考FAQ“在外接程序中如何向文档表面添加托管的控件”

    更多的有关VSTOFAQ,请看

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:33
    版主
  • 2. 共享外接程序和VSTO应用程序级外接程序之间的相同点和不同点有哪些?

    共享外接程序和VSTO应用程序级外接程序之间的相同点有:

    1.      它们都是注册在宿主应用程序的注册表键值中的,比如HKCU\Software\Microsoft\Office\Word\Addins.这些外接程序被Office加载后,都会出现在COM Add-in对话框。

    2.      基于COM接口上编译它们。这些外接程序通过利用Office对象模型来进行Office的延伸。可以想Office应用程序添加可扩展性的界面,比如自定义任务窗格功能区,Outlook窗体区域。

    因为在共享外接程序和VSTO应用程序级外接程序之间有很多的不同点,所以我们仅列出其中的关键点。

    1.      正如名字所提示的,一个共享外接程序可以被很多不同的Office应用程序所共享。所以,共享外接程序需要额外的代码分辨宿主应用程序。然而在VSTO外接程序中,一个外接程序只能服务一个宿主应用程序。所以,在我们的外接程序中,我们正在工作的是强类型的宿主应用程序。我们再也不需要把这个应用程序对象转换为另外的,或者用晚绑定来调用它的方法。

    2.      为了在共享外接程序中建立可扩展性的界面,比如功能区,自定义任务窗格Outlook窗体区域,开发人员须实现三个接口:Office.IRibbonExtensibilityOffice.ICustomTaskPaneConsumerOutlook.FormRegionStartup。无论建立那种可扩展性的界面,都需要手动地写大量的代码。然而,如果用VSTO,这些工作都被封装起来了。我们仅需要想项目添加一个新的RibbonUserControl,或者FromRegion条目,这是因为现在支持在VSTO的设计器中设计这三种用户界面。我们所需要做的就是拖拽控件,设置属性,像在Windows窗体设计器右击产生事件处理程序。

    3.      另外一个重要的不同点就是模型的安全性。对于IDTExtensibility2共享外接程序,一直以来都没有拥有任何的代码访问安全性策略这种需求。所以,在Office加载共享外接程序时,我们没有必要调用caspol.exe外接程序的程序集授予完全信任权限。对于VSTO,直到版本2008,我们都用的是.NET安全性策略。然而,VSTO 2008 用的是ClickOnce部署和验证码模型。

    4.      VSTO建立一个新的应用程序域用来加载一个VSTO外接程序。所以,它们相互都不会影响。开发人员没有必要担心Outlook不会关闭”的问题。当VSTO外接程序关闭时,相应的应用程序域也会卸载,同时回收分配应用程序使用的资源。

    5.      VSTO外接程序默认是被安装到HKCU (单个用户)下的,但是共享外接程序可以被部署到HKLM。所以,如果我们想要把VSTO外接程序部署给所有的用户,我们须做一些额外的手动工作。更多的信息,请参考:http://blogs.msdn.com/mshneer/archive/2008/04/24/deploying-your-vsto-add-in-to-all-users-part-iii.aspx

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/3f97705a-6052-4296-a10a-bfa3a39ab4e7/

    更多的有关VSTOFAQ请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:33
    版主
  • 3. VSTO文档级自定义项和VSTO应用程序级外接程序有哪些不同点?

    当开发一个文档级自定义项时,只有终端用户打开特定的office文档,代码才会被加载和执行。当对应的文档被关闭时,文档级自定义项同时也被卸载。对于应用程序级外接程序,无论新的Office应用程序实例是如何被创建的,双击一个Office文件或者Office执行文件,它都会被加载。当关闭office应用程序是,应用程序级外接程序也会被卸载。

    关于更多的文档级自定义项和应用程序级外接程序的信息,请参考下面的两篇文章:

    http://msdn.microsoft.com/en-us/library/zcfbd2sk.aspx

    http://msdn.microsoft.com/en-us/library/bb386298.aspx

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/55562552-144f-4900-8b0c-dad5867ae3fd/


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:34
    版主
  • 4. 当部署一个外接程序时,在客户端上需要哪些注册表项?

    VSTO第一和第二个版本都需要配置标准的安装项目来注册外接程序。我们可以在安装项目的注册视图中找到这些注册表键值。

    VSTO第三个版本中,如果开发者想用安装项目,他们必须手动添加注册步骤。

    了解运行应用程序级外接程序时需要的注册表键值,对客户端的外接程序加载问题的故障诊断将是有用的。为了获得注册表键值的完整列表,请阅读下面的文档。

    http://msdn.microsoft.com/zh-cn/library/bb386106.aspx

    有关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/ed802c73-255b-4f60-bc65-43f8a15f48e1/


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:34
    版主
  • 5. 如何从外部的应用程序中调用外接程序的功能?

    共享外接程序用COMAddIns.Object向外部应用程序公开它的功能,所以OnConnection的实现大概是这样:((COMAddIn)AddInInst).Object = new MyAutomationObject()

    然而在VSTO中不能用这种方法。这是因为只有在OnConnection功能中,设置COMAddIns.Object才被允许,而在VSTO项目中OnConnection是不可见的。

    为了在VSTO达到这种目标,我们需要重写外接程序基类中的RequestCOMAddInAutomationService。在这个功能的实现中,我们仅返回一个新的COM Visible类。

    [ComVisible(true)]

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]

    public interface IAddinUtilities

    {

        void DoSomething();

    }

    [ComVisible(true)]

    [ClassInterface(ClassInterfaceType.None)]

    public class AddinUtilities :

        StandardOleMarshalObject,

        IAddinUtilities

    {

        public void DoSomething()

        {

            Globals.ThisAddIn.CreateNewTaskPane();

        }

    }

    public partial class ThisAddIn

    {

        private AddinUtilities addinUtilities;

        protected override object RequestComAddInAutomationService()

        {

            if (addinUtilities == null)

            {

                addinUtilities = new AddinUtilities();

            }

            return addinUtilities;

        }

    }

    VSTO将为我们把这个返回的对象值设为当前的COMAddIn.Object的值。然后,我们可以从COMAddIn.Object中获得addInUtilities,在VBA或者外部应用程序中调用它公开的功能。

    Private Sub CommandButton2_Click()

        Dim addin As Office.COMAddIn

        Dim utilities As ExcelAddinService.addinUtilities

        Set addin = Application.COMAddIns("ExcelAddinService")

        Set utilities = addin.Object

        Call utilities.SetCellValue("a1", 456.78)

    End Sub

    关于这个内容,在Andrewblog里,现有一篇详细的文章:

    http://blogs.msdn.com/andreww/archive/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice.aspx

    至于为什么我们要使AddInUtilites继承自StandardOleMarshalObject的原因,请阅读:

    http://blogs.msdn.com/b/andreww/archive/2008/08/11/why-your-comaddin-object-should-derive-from-standardolemarshalobject.aspx

    更多的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/11e4b5aa-fd42-4261-9f97-50c434a8d25e/

    添加VB代码:

    <ComVisible(True)> _

    <InterfaceType(ComInterfaceType.InterfaceIsDual)> _

    Public Interface IAddinUtilities

       Sub DoSomething()

    End Interface

    <ComVisible(True)> _

    <ClassInterface(ClassInterfaceType.None)> _

       Public Class AddinUtilities

       Inherits StandardOleMarshalObject

       Implements IAddinUtilities

       Public Sub DoSomething() Implements IAddinUtilities.DoSomething

           Globals.ThisAddIn.CreateTaskPane()  

       End Sub

    End Class

    Partial Public Class ThisAddIn

       Private addinUtilities As AddinUtilities

       Protected Overrides Function RequestComAddInAutomationService() As Object

           If addinUtilities Is Nothing Then

               addinUtilities = New AddinUtilities()

           End If

           Return addinUtilities

       End Function

    End Class


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:35
    版主
  • 6. 为什么在C#源代码编辑器里Office对象模型的一些事件是不可见的?

    这种情况经常发生在Office对象的一个方法和事件有相同的名字。默认地,当我们输入统一的名称,Visual Studio将认为这是一个方法而不是事件。

    为了正确地使用这个事件,首先我们需要转换对象为XXXEvents_Event类型,再注册相应的事件。下面的代码显示有关Excel WorkbookActivate事件的例子。

    ((Excel.WorkbookEvents_Event)(Globals.ThisWorkbook.InnerObject)).Activate += new Excel.WorkbookEvents_ActivateEventHandler(ThisWorkbook_Activate);

    更多的有关VSTOFAQ,请看:
    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:36
    版主
  • 7. 为什么我们的命令栏中按钮的事件仅在第一次触发?

    当命令栏中按钮被声明为临时变量,也就是在函数内,这种情况经常发生。函数结束后,命令栏按钮作为临时变量会被GC回收。结果,被回收的对象的click事件将不会发生。

    这个问题的解决方案就是声明这个命令栏控件为类级别范围内的,以便于它不会被GC线程回收。注意Tag属性也是很重要的,因为它被Office应用程序用来在运行时跟踪按钮,在这种情况下它必须被设置。代码是这样的:

    public partial class ThisAddIn

       {

           Office.CommandBar cb;

           Office.CommandBarButton btn;   //在类级别范围内声明按钮.

           private void ThisAddIn_Startup(object sender, System.EventArgs e)

           {

               cb = this.Application.ActiveExplorer().CommandBars.Add("test", Office.MsoBarPosition.msoBarTop,false, true) as Office.CommandBar;

               cb.Visible = true;

               btn = cb.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) as Office.CommandBarButton;

               btn.Caption = "My Button";

               btn.Tag = "My Button";   //不要忘了设置Tag属性

               btn.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(btn_Click);

           }

          

    }

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/dda9c1c7-d5d4-4f94-b60a-070f99becb6f/

    更多的有关VSTOFAQ,请看:
    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码:

    Public Class ThisAddIn

       Dim cb As Office.CommandBar

       Dim btn As Office.CommandBarButton  'Declare the button in class level scope

       Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

           cb = CType(Me.Application.ActiveExplorer().CommandBars.Add("test", Office.MsoBarPosition.msoBarTop, False, True), Office.CommandBar)

           cb = Me.Application.ActiveExplorer().CommandBars.Add("test", Office.MsoBarPosition.msoBarTop, False, True)

           cb.Visible = True

           btn = CType(cb.Controls.Add(Office.MsoControlType.msoControlButton, , , , True), Office.CommandBarButton)

           btn.Caption = "My Button"

           btn.Tag = "My Button"   'Do not forget to set the Tag property

           AddHandler btn.Click, AddressOf btn_Click  

    End Sub

    End Class


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:36
    版主
  • 8. 怎样建立一个非模态的窗口,Office主窗口作为它的拥有者?

    我们可以调用Form.Show(IWin32Window)函数向特定用户显示窗体。为了传递正确的IWin32Window类型的实参,我们创建一个NativeWindow对象,并调用NativeWindow.AssignHandle(IntPtr)函数把本地窗口对象绑定到Office本地窗口。下面的代码向我们显示如何在Word中实现它:

           public partial class NativeMethods

           {

               [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "FindWindowW")]

               public static extern System.IntPtr FindWindowW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpClassName, [System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpWindowName);

           }

           private void ThisAddIn_Startup(object sender, System.EventArgs e)

           {

               IntPtr wordWindow = NativeMethods.FindWindowW("OpusApp",this.Application.ActiveWindow.Caption+" - Microsoft Word");

              NativeWindow nativeWindow = new NativeWindow();

               nativeWindow.AssignHandle(wordWindow);

               Form childWindow = new Form();

               childWindow.Show(nativeWindow);

           }

    至于ExcelOutlook,请参考下面的链接:

    http://social.msdn.microsoft.com/forums/en-US/vsto/thread/2498af9b-2172-43cf-8616-1863f293ccb8/

    http://www.outlooksharp.de/Resources/HowTos/tabid/67/Default.aspx

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/45a82d73-dfe2-4ad1-a0a6-bac35ae5bd64/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码,

    Public Class ThisAddIn

       Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

          Dim wordWindow As IntPtr

           wordWindow = NativeMethods.FindWindowW("OpusApp", Me.Application.ActiveWindow.Caption + " - Microsoft Word")

           Dim nativeWindow As New System.Windows.Forms.NativeWindow

           nativeWindow.AssignHandle(wordWindow)

          Dim childWindow As New System.Windows.Forms.Form

           childWindow.Show(nativeWindow)

       End Sub

    End Class

    Partial Public Class NativeMethods

       Declare Function FindWindowW Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As System.IntPtr

    End Class


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:37
    版主
  • 9. 当在Outlook Explorer中右击邮件时,如何向上下文菜单添加按钮?

    这个问题的方法取决于我们正在工作的Outlook版本?

    (1)    如果当前的版本是Outlook 2007,通过注册Application.ItemContextMenuDisplay事件,我们可以容易地实现这个目标。然后有一个带有两个参数的函数来处理该事件,一个是CommandBar对象,另一个是选中的邮件。为了向上下文菜单添加按钮,仅调用CommandBar.Controls.Add()

    请参考这个链接:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/74e3fbaf-5806-4684-b410-65a0720386e8/

    (2)    Outlook 2007对象模型,Application.ItemContextMenuDisplay事件是首次被引进。如果是Outlook 2003,为了这个目标,我们必须监听CommandBars.OnUpdate事件。但是在事件处理程序中,没有那种代表相应的命令栏的控件。我们需要通过下面的表达式来得到命令栏:Application.CommandBars[“Context Menu”]

    我们可以从下面的链接中获得代码示例:http://www.outlookcode.com/codedetail.aspx?id=314

    请注意:微软不支持在Office 2003中进行“上下文菜单”自定义项。使用这个代码会有一定的风险。由于Outlook 2003产品实现的改变,解决方案可能会在某处中断。官方上,自定义Outlook 2003的上下文菜单是不被支持的。

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/74e3fbaf-5806-4684-b410-65a0720386e8/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码,

    Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

           AddHandler Application.ItemContextMenuDisplay, AddressOf Application_ItemContextMenuDisplay

    End Sub

    Sub Application_ItemContextMenuDisplay(ByVal CommandBar As Microsoft.Office.Core.CommandBar, ByVal Selection As Microsoft.Office.Interop.Outlook.Selection)

           Dim cb As Office.CommandBarButton

           cb = CommandBar.Controls.Add(Office.MsoControlType.msoControlButton, , , , True)

           cb.Visible = True

           cb.Caption = "NewButton"

    End Sub


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:38
    版主
  • 10. 为什么在部署后,我们的VSTO外接程序没有被加载,而在Visual Studio中调试时可以工作在开发的机器上?

    可能会有很多的原因导致外接程序没有被加载,但是我们应检查的第一件事是安全性状态。在安装机器上运行解决方案之前,我们需要使用Caspol工具来外接程序的程序集和所以的被引用的程序集授予完全信任权限。对于运行在VSTO Runtime 2.0下面的项目,情况也是这样的。

    1.      通过VSTO SE开发的Office 2003外接程序

    2.      通过VSTO SE开发的Office 2007外接程序

    3.      通过Visual Studio 2008开发的Office 2003外接程序

    Caspol命令行来授予完全信任权限如下:

    caspol -u -ag All_Code -url "{The assembly’s full path}" FullTrust -n "{The code group name}".

    为了将Caspol过程结合到安装项目中,我们需要创建一个自定义操作在部署结束时来调用Caspol。在下面的链接里,微软根据这个主题已经发布了两篇文章。它也提供了一个名为”SetSecurity”的实例项目来用作自定义操作。确保在安装项目中使用正确的CustomActionDataCustomActionData字符串中每个元素之间有个空格。

    http://msdn.microsoft.com/en-us/library/bb332051.aspx

    http://msdn.microsoft.com/en-us/library/bb332052.aspx

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/0b794df0-5012-41a2-9623-0dbc5b865994/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:38
    版主
  • 11. 怎样在Outlook 2003 主窗口中添加一个命令栏(CommandBar)和按钮(buttons)?

    Outlook应用程序有两种类型的用户界面窗口:Explorer窗口和Inspector窗口。主要的用户界面是一个explorer,邮件/联系人/任务/会议窗口是Inspector类型的。我们可以通过调用this.Application.ActiveExplorer().CommandBars.Add(…)方法向Explorer窗口添加命令栏。

    但是为了向inspector窗口添加任务栏和按钮,我们需要监听Application.Inspectors.NewInspector事件。无论一个新的inspector是被创建或者显示,都会激发这个事件。在处理函数中,我们从参数中接收到一个inspector对象的实例。然后我们调用Inspector.CommandBars.Add(…)来创建任务栏。

    代码是这样的:

           Outlook.Inspectors inspectors = null;

           Office.CommandBar cb;

           Office.CommandBarComboBox edt;

           Office.CommandBarButton btn;

           private void ThisAddIn_Startup(object sender, System.EventArgs e)

           {

               inspectors.NewInspector += new Microsoft.Office.Interop.Outlook.InspectorsEvents_NewInspectorEventHandler(inspectors_NewInspector);

           }

           void inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)

           {

               cb = Inspector.CommandBars.Add("test", Office.MsoBarPosition.msoBarTop,

                   false, true) as Office.CommandBar;

               cb.Visible = true;

               cb.Protection = Microsoft.Office.Core.MsoBarProtection.msoBarNoCustomize;

               edt = cb.Controls.Add(Office.MsoControlType.msoControlEdit, missing, missing, missing, true) as Office.CommandBarComboBox;

               edt.Caption = "My Editor";

               edt.Tag = "My Editor";

               btn = cb.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, missing, true) as Office.CommandBarButton;

               btn.Caption = "My Button";

               }

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/4ca19753-9883-4a86-a825-36de4e3ba941/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码,

    public class ThisAddIn

       Dim inspectors As Outlook.Inspectors

       Dim cb As Office.CommandBar

       Dim edt As Office.CommandBarComboBox

       Dim btn As Office.CommandBarButton

      

       Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

           inspectors = Application.Inspectors

           AddHandler inspectors.NewInspector, AddressOf inspectors_NewInspector

       End Sub

       Sub inspectors_NewInspector(ByVal Inspector As Microsoft.Office.Interop.Outlook.Inspector)

           cb = Inspector.CommandBars.Add("test", Office.MsoBarPosition.msoBarTop, False, True)

           cb.Visible = True

           cb.Protection = Microsoft.Office.Core.MsoBarProtection.msoBarNoCustomize

           edt = cb.Controls.Add(Office.MsoControlType.msoControlEdit, , , , True)

           edt.Caption = "My Editor"

           edt.Tag = "My Editor"

           btn = cb.Controls.Add(Office.MsoControlType.msoControlButton, , , , True)

           btn.Caption = "My Button"

           btn.Tag = "My Button"

       End Sub

    End Class


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:39
    版主
  • 12. 当自定义任务窗格是浮动的,如何获得它的位置?

    VSTO的自定义任务窗口对象没有公布LeftTop属性来说明位置信息。但是,我们有一些可能的解决方案。

    1.      我们可以通过Office CommandBar对象得到自定义任务窗口对象。这是最简单的解决方案:

    String ctpName = “Custom Task Pane”;

    this.CustomTaskPanes.Add(new UserControl1(), ctpName).Visible = true;

    this.Application.CommandBars[ctpName].Left

    this.Application.CommandBars[ctpName].Top

    2.      我们也可以用Windows API FindWindowWGetWindowRect来获得位置信息。更多的详细信息,请参考论坛里的讨论:

    http://social.msdn.microsoft.com/forums/en-US/vsto/thread/ed72d66d-6159-49fd-a6e2-ad365f275bb3/

    相关的论坛贴子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/ed72d66d-6159-49fd-a6e2-ad365f275bb3/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码,

    Dim ctpName As String

    ctpName = "Custom Task Pane"

    Me.CustomTaskPanes.Add(New System.Windows.Forms.UserControl, ctpName).Visible = True

    Me.Application.CommandBars.Item(ctpName).Left

    Me.Application.CommandBars.Item(ctpName).Top


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:39
    版主
  • 13. 如何以编程方式设置功能区的控件?

    这取决于我们如何建立功能区,通过可视设计器或者功能区XML自定义项。

    1.      如果我们使用可以设计器来创建功能区,我们可以通过Globals.Ribbons来访问功能区和它们的控件。以切换按钮为例,当它被按下时,我们使用下面的代码设置它的状态。

           private void ThisAddIn_Startup(object sender, System.EventArgs e)

           {

               Globals.Ribbons.Ribbon1.toggleButton1.Checked = true;

           }

    2.      如果我们使用XML文件来自定义功能区,我们需要为控件编写相应的回调函数。我们仍然可以以切换按钮为例,我们可以定义切换按钮的getPressed回调函数,如下:

    <toggleButton id="toggleButton1" label="toggleButton1" size="large" getPressed ="get_Pressed" />

    然后我们像下面的来实现get_Pressed。当函数返回真,这个切换按钮将处于被按下的状态。而当函数返回False是,这个切换按钮将处于没有被按下的状态。我们可以随处调用ribbon.Invalidate()来强制执行回调函数。      

    public bool get_Pressed(Office.IRibbonControl control)

           {

               if (Globals.ThisAddIn.ctp.Visible)

               {

                   return true;

               }

               else

               {

                   return false;

               }

           }

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/2f1e4fb1-8de2-4ac0-887d-b48013e7c274/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码:

    Public Function get_Pressed(ByVal control As Office.IRibbonControl) As Boolean

           If Globals.ThisAddIn.ctp.Visible Then

              Return True

           Else

               Return False

           End If

    End Function


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:40
    版主
  • 14. 如何在没有安装Visual Studio的编制服务器上编制一个VSTO项目?'

    VSTO项目的编译过程依靠若干个MSBuild任务,这个任务与Microsoft.VisualStudio.Tools.Office.Office2003.targets Microsoft.VisualStudio.Tools.Office.Office2007.targets files一同使用。这些任务在编译机器上注册外接程序,生成应用程序和部署清单,更新安全性。Visual Studio 附带包含这些任务的程序集。为了用MSBuild编译VSTO项目,我们需要复制这些目标和任务程序集文件到编译服务器上。

    需要下面的文件:

    1.      文件夹C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\OfficeTools和它的内容:2003/2007目标文件。

    2.      Microsoft.VisualStudio.Tools.Applications.BuildTasks

    3.      Microsoft.VisualStudio.Tools.Office.BuildTasks.

    我们可以从Kentblog中得到更多详细步骤:

    http://kentb.blogspot.com/2008/08/building-vsto-projects-without-visual.html

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/0e072b91-925d-48a2-abb6-8c752e56ff25/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:40
    版主
  • 15. 在外接程序中,如何向文档表面添加托管控件?

    Visual Studio 2008 SP1之前,我们仅可以在文档级项目中添加托管控件到Office文档中。用Visual Studio 2008 SP1,我们可以为应用程序级项目达到相同的目标。

    核心是VSTO已经从类DocumentExtensions中导出一个名叫GetVstoObject()的方法,这个类在Microsoft.Office.Tools.Word.Extensions命名空间。这是一个扩展的方法,可以从本地Word文档调用它。方法GetVstoObject()将返回一个VSTO包装的文档。我们可以调用Microsoft.Office.Tools.Word.Document.Controls.Add()把托管控件放到文档表面。

    在外接程序启动中,下面的示例代码向Word文档添加一个按钮:

              private Button btn = null; 

           private Microsoft.Office.Tools.Word.Document doc = null;

           private void ThisAddIn_Startup(object sender, System.EventArgs e)

           {

               doc = this.Application.ActiveDocument.GetVstoObject();

               btn = doc.Controls.AddButton(0, 0, 50, 20, "MyButton");

               btn.Click += new EventHandler(btn_Click);

               btn.Text = "My Button";

           }

           void btn_Click(object sender, EventArgs e)

           {

               MessageBox.Show("This is a managed button in Word Add-in project");

           }

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/37c49ef4-8ca7-4874-b82c-f8f170daf08a/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:41
    版主
  • 16. 怎样从VSTO文档删除自定义项?

    Visual Studio Tools for Office提供一个名为ServerDocument的类,它可以访问自定义文档中的缓存数据和应用程序清单。在Office 2003项目中,这个类是通过VSTO SE Runtime来实现的,它包含在Microsoft.VisualStudio.Tools.Application.Runtime命名空间中。同样对于Office 2007项目中,它这个类是通过VSTO 3.0 Runtime来实现的,它包含在Microsoft.VisualStudio.Tools.Application命名空间中。

    因为VSTO 2005 SE RuntimeVSTO Runtime 3.0 的实现是不同的,这两个ServerDocument类的用途是不一致的。然而,对于RemoveCustomization()方法,他们是相同的,仅需要一个字符串类型的参数,该参数指向文档的完整路径,在这个文档中包含想要删除的自定义项。请参考下面的代码达到这些结果:

    private static void Remove(string fileName)

    {

       if (ServerDocument.IsCustomized(fileName))

       {

           ServerDocument.RemoveCustomization(fileName);

           MessageBox.Show("The customization has been removed.");

       }

       else

       {

           MessageBox.Show("The specified document is not " + "customized.");

       }

    }

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/a0cdb75a-b143-47f4-909d-5af529ec704f/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba

    添加VB版本的代码,

    Private Shared Sub Remove(ByVal fileName As String)

       If(ServerDocument.IsCustomized(fileName)) Then

          ServerDocument.RemoveCustomization(fileName)

           MessageBox.Show("The customization has been removed.")

       Else

           MessageBox.Show("The specified document is not " + "customized.")

       End If

    End Sub


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:42
    版主
  • 17. 在自定义任务窗格被关闭时,是否有个类似的关闭事件可以追踪的?它会被回收吗?

    当用户关闭自定义任务窗格,可以处理VisualChanged事件。然而请注意,在VisibleChanged事件处理程序中,Office应用程序会阻止你修改自定义任务窗格的一些属性,比如WidthHeightVisibleDockPosition属性。如果你试图改变这些属性,将会抛出一个COMException

    自定义任务窗格(连同一些属性)保留在内存中直到外接程序被卸载掉,或者显示地使用ThisAddIn.CustomTaskPanes.Remove或者ThisAddIn.CustomTaskPanes.RemoveAt方法。多数的自定义任务窗格旨在工作于“应用程序级”,意味着用户在特定的用户会话里可能会多次显示或者隐藏同样的任务窗格。在这些情况下,重用相同的自定义任务窗格对象是有意义的。这意味着当用户每次显示任务窗格时,自定义任务窗格能够被重用。如果不想使自定义任务窗格保留在内存中,你可以使用相应的RemoveRemoveAt方法。

    你可能想怎么做的其中一种情况就是Outlook,你可能想为已被打开的每个项目(邮件,联系人等等)显示唯一的自定义任务窗格。在这种情况下,为了有效地使用资源,你极有可能想在用户关闭相应的项目时,显示地清除每个任务窗格。

    请参见这个演示:为 Outlook中的电子邮件显示自定义任务窗格。相关的链接:http://msdn.microsoft.com/zh-cn/library/bb296010.aspx

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/be8109b6-b56e-4153-acb6-f97f47dbbdff/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:42
    版主
  • 18. VSTO和VSTA有什么相同点和不同点?

    Visual Studio Tools for Application (VSTA)Visual Studio Tools for Office (VSTO)之间既有不同点也有相同点。比较如下:

    事实上,从它们的名字就可以看出核心的不同点。

    *Visual Studio Tools for Office,

    它是Visual Studio的组件,允许开发者用托管代码进行Office扩展性。如果你仅想扩展Office应用程序,VSTO满足你的需求。

    *Visual Studio Tools for Applications,

    从它的名称中,不仅Office应用程序可以被扩展,而且你自已用MFC或者Windows From编写应用程序也可以被扩展。比如,公司A制造了一个名为“ShapeDraw”的软件产品。这个产品在市场上很畅销,所以公司A希望其它独立的软件公司(ISV)为“ShapeDraw”开发外接程序,所以公司A利用VSTA公开ShapeDraw的对象模型。然后ISV也利用VSTA和公开的对象模型来扩展ShapeDraw。在ISV的客户试图中,ShapeDraw就像是OfficeVSTA就想一个托管的VBA环境。我们甚至可以在ShapeDraw中为我们的行为VSTO录制和运行宏。

    为了更好地理解VSTA,请参考下面的文章和视频:http://blogs.msdn.com/b/vsta/archive/2007/04/27/vsta-video-vsta-at-a-glance.aspx

    从另一个文章:http://blogs.msdn.com/b/vsta/archive/2006/11/10/vsta-rtm-s-with-the-2007-office-system.aspx,我们可以看到VSTA当做Office 2007集成组件已经被发布。所以,这种情况下,在功能层次上,VSTAVSTO具有相似性,但是在用户界面层次上,VSTA更像是Visual StudioVBA环境。

    相关的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/ad8ff437-916e-4b32-9d08-50a5e604777f/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:42
    版主
  • 19. 为什么,一旦VSTO v3外接程序或者文档被安装后,就不能改变安装位置?

    部署清单的路径被用作外接程序标识的一部分。在外接程序或文档安装过程中,通过VSTO Runtime为客户端设置和保存完整路径。一旦外接程序已被安装,在注册表中修改路径将导致外接程序抛出错误。一旦自定义的文档被安装,后台代码将只检查原来的地址,保存在文档中被修改的路径将被忽视(允许从远程位置复制自定义文档的本地版本)。为了修改外接程序或者文档检查更新的地址,你必须从已安装的客户端卸载掉旧版本,再从新位置安装新的版本。

    当存储解决方案到ClickOnce缓存,ClickOnce使用解决方案路径作为标识的一部分。在Windows应用程序的部署中,也有类似的行为,除非你使用部署提供程序URL (DPURL)。设置DPURL可以允许WinForms应用程序修改输出更新的地址,以便于服务器A(最初安装解决方案的地址)能够被关闭,能够从服务器B获取更新。VSTO不支持DPURL。当时在Visual Studio 2008的开发中考虑过它,所需要的开发时间超过我们所剩的时间 (比如,DPURL蕴含数据从旧到新的解决方案的迁移)。经过讨论,我们决定让ClickOnce团队VSTO解决方案抛出DPURL异常。在Visual Studio 2010开发开始阶段,我们再次考虑到这个特性,但仍没有被添加到最高优先权部署特性列表中。我们正在为Visual Studio 2010实现许多新的部署特性。

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:43
    版主
  • 20. 怎样通过代码激活Office 2007的功能区?

    Office 2007设计的功能区对象模型没有提供方法用来激活特定的功能区选项卡。

    我们可以使用两个基本的方法解决这个问题。它们每个方法都有弊端。

    1.      使用SendKeys命令(Windows.Forms 命名空间)模仿用户的按压 Alt+ [keytip] (keytip是你指定给选项卡的)

    弊端:1) SendKeys不是总是能执行。2)如果其它的外接程序指定相同的keytip,就会有冲突以至于SendKeys不能工作。

    2.      使用为功能区提供的Windows Accessibility API选取选项卡。下面是讨论这个主题的链接。

    弊端:需要编写很多的代码。

    相关的资源:

    2007 Office Fluent用户界面中使用Active Accessibility: http://msdn.microsoft.com/en-us/library/bb404170.aspx

    基于Pranav的工作,相对简单的实例和讨论:

    http://wordarticles.com/Shorts/RibbonVBA/RibbonVBADemo.htm

    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:43
    版主
  • 21. 如何检测一个Office应用程序是内嵌状态?

    对于这个问题,没有固定的方法。但是一般作为解决方法,当Office应用程序作为OLE对象被内嵌,它由父进程svchost.exe创建。为找出Office应用程序的父进程,我们可以使用WMI。代码如下:

           private void ParentProcessUseWmi(int pID)

           {

               ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID=" + pID);

               ManagementObjectCollection moc = searcher.Get();

               foreach (ManagementObject mo in moc)

               {

                   if (mo["ParentProcessID"] != null)

                   {

                  MessageBox.Show(Process.GetProcessById(Convert.ToInt32(mo["ParentProcessID"])).ProcessName);

                   }

                   searcher.Dispose();

                   searcher = null;

                   moc.Dispose();

                   moc = null;

               }

           }


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:44
    版主
  • 22. Office可以加载面向 .NET Framework不同版本的外接程序吗?

    .NET Framework 4.0的一个主要特性就是用.NET Framework 3.5.NET Framework 3.0 .NET Framework 2.0 (它们都是使用 v2 CLR)外接程序可以被加载为进程内的。

    因此,:现在Office可以同时加载面向.NET Framework 4.0的外接程序和面向.NET Framework 3.5的外接程序。

    更多有关进程内并行执行,请看:

    http://msdn.microsoft.com/zh-cn/magazine/ee819091.aspx

    http://msdn.microsoft.com/zh-cn/library/ee518876.aspx

    相关的帖子:http://social.msdn.microsoft.com/Forums/en/vsto/thread/2ab98d2a-7bb8-478f-8036-742aa73c0405

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:44
    版主
  • 23. 如何添加命令栏到Outlook 2007 所有的Explorers中?

    为实现此目标,我们需要监听NewExplorer事件,在NewExplorer事件处理程序中,添加命令栏到没有Explorer中。我们可以使用Helmut所写的C#封装实例。通过创建与每个ExplorerInspector窗口关联的GUID,封装每个ExplorerInspector。以后我们可以通过使用这个GUID访问每个ExplorerInspector

    我们可以在下面的链接中找到这个C#封装实例:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/14f07ba0-1e56-418b-bb31-add5926e52cc/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:45
    版主
  • 24. 如何将组添加到Word 功能区的内置选项卡中?如何将选项卡添加到内置选项卡前面?

    Visual Studio Tools for Office,我们可以使用功能区 (XML)或者功能区 (Designer)自定义Office用户界面功能区。

    1.      对于Ribbon (XML)方法,向外接程序项目中添加功能区(XML) 项。然后,我们可以自定义ribbon.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">

    <ribbon>

       <tabs>

         <tab idMso="TabInsert">

           <group id="group1" insertBeforeMso="GroupFont">

             <button id="button1" size="large" label="button1"

                      onAction="OnClick" imageMso="L"></button>

           </group>

         </tab>

         <tab id="TabAddIns" label="Tab1" insertBeforeMso="TabInsert">

           <group id="group2"

                  label="group2">

          </group>

         </tab>

       </tabs>

    </ribbon>

    </customUI>

    使用idMso属性找到内置的选项卡//控件。上面的ribbon.xml将组添加到内置的选项卡“插入”。也在选项卡“插入”前添加一个选项卡。

    2.      对于Ribbon(Designer)方法,我们需要添加功能区(可视化设计器)项。我们可以遵循下面的步骤将组添加到内置的选项卡(插入选项卡)中。

    1)     单击选中TabAddIns(选项卡)选项卡。

    2)     在“属性”窗口中展开“ControlID”属性,然后将“OfficeId”设置为“TabInsert”。再将一个按钮拖到选项卡“插入”的默认组中。

    3)     单击选中group1.

    4)     在“属性”窗口中,展开“Position”属性,单击“PositionType”属性旁的下拉箭头,然后单击“BeforeOfficeId”。

    5)     将“OfficeId”属性设置为“GroupFont”。

    将自定义选项卡添加到内置选项卡前面,单击选中功能区。通过单击属性窗口中的Tab属性,打开Tab Collection Editor对话框,向功能区添加一个选项卡。在这个添加的选项卡属性窗口中,

    1)     展开“Position”属性,单击“PositionType”属性旁的下拉箭头,然后单击“BeforeOfficeId”。

    2)     将“OfficeId”属性设置为“TabInsert”。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:45
    版主
  • 25. 在哪里能找到不同Office应用程序的PIA组件IDs?

    我们可以使用Orca工具检查Office安装文件ProPlus.WW\ProPlusWW.msi内嵌的组件表格。用Orca检查Office 2010安装msi文件找到下面的PIA组件Ids

    {EA7564AC-C67D-4868-BE5C-26E4FC2223FF}   Excel

    {4153F732-D670-4E44-8AB7-500F2B576BDA}    InfoPath

    {1D844339-3DAE-413E-BC13-62D6A52816B2}   Outlook

    {EECBA6B8-3A62-44AD-99EB-8666265466F9}    PowerPoint

    {3EA123B5-6316-452E-9D51-A489E06E2347}     Visio

    {8B74A499-37F8-4DEA-B5A0-D72FC501CEFA}   Word

    {957A4EC0-E67B-4E86-A383-6AF7270B216A}    Project

    {B2279272-3FD2-434D-B94E-E4E0F8561AC4}    Forms 2.0

    {011B9112-EBB1-4A6C-86CB-C2FDC9EA7B0E}  Graph

    {7102C98C-EF47-4F04-A227-FE33650BF954}     Smart Tag

    {64E2917E-AA13-4CA4-BFFE-EA6EDA3AFCB4}   Office Shared

    相关的帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/9bde5b41-f5da-4918-b62b-8ab24479ef93

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:45
    版主
  • 26. 如何为VSTO应用程序创建一个初始屏幕?

    VSTO里创建一个初始屏幕是很平常的需求。你可以采用两种方法。第一种也就是最初能想到的是简单地在后台线程中显示模态窗口。这可能是最直接的方法,代码如下:

    using System;

    using System.Collections.Generic;

    using System.Data;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using System.Xml.Linq;

    using Microsoft.VisualStudio.Tools.Applications.Runtime;

    using Excel = Microsoft.Office.Interop.Excel;

    using Office = Microsoft.Office.Core;

    using System.Threading;

    namespace ExcelWorkbook13

    {

    public delegate void InvokeClose();

    public partial class Sheet1

    {

    private Form1 m_splashScreen = new Form1();

    private void Sheet1_Startup(object sender, System.EventArgs e)

    {

    //准确地,NativeWindow作为子类(不必要的)//创建自己的IWin32Window实现也许更可取

    //因为它是比较安全的IntPtr hwndExcel = new IntPtr(Application.Hwnd);

    NativeWindow parent = new NativeWindow();

    parent.AssignHandle(hwndExcel);

    try

    {

    Thread t = new Thread(SplashScreenProc);

    t.Start(parent);

    //考虑:可能想为同步使用事件来确保在开始操作之前//显示出示屏幕

    //循环操作for (int i = 1; i < 10000; i++)

    {

    Excel.Range r = (Excel.Range)this.Cells[i, 1];

    r.Value2 = i;

    }

    //必须使用invoke,因为正在调用交叉的线程InvokeClose invokeClose = new InvokeClose(m_splashScreen.Close);

    m_splashScreen.Invoke(invokeClose);

    }

    finally

    {

    //必须经常撤销子类,否则会失败Must always undo the subclass or you can crash!

    parent.ReleaseHandle();

    }

    }

    //显示初始屏幕Display the splash screen

    private void SplashScreenProc(object param)

    {

    //撤销:UNDONE: 确定出初始屏幕的位置the splash screen.

    IWin32Window parent = (IWin32Window)param;

    m_splashScreen.ShowDialog(parent);

    }

    }

    }

    另外一种方法是在进行长任务之前(正如Martin建议的那样),在主线程中显示非模态窗口。如果你那样做,你将需要在每次循环中弹出消息。这正是Martin的代码遗漏的。可能你也想P/Invoke Win32 PeekMessage函数来做这些,因为你可能想阻止多数的消息被调度(也就是你不想调度用户输入消息,但是你想调度OLERPC消息,这个消息将避免以前看到的ContextSwitchDeadlock MDA)。你将需要创建一个消息弹出循环,大致是这样的:

    while (PeekMessage(...))

    {

       DispatchMessage(...);

    }

    System.Windows.Forms.Application.DoEvents将会你做这些工作,但是它也会让所有的消息通过,所以用户输入将被加工。也有点奇怪,因为VSTO不是Windows窗体应用程序,所以有可能(尽管可能性很小)DoEvents的实现在将来可以改变,以至于在上下文中它将不再与预期相符。

    这个方法可行,但是它很难实现,比较慢。所以对于多数的情况,在后台线程中显示初始屏幕更有意义。

    相关的论坛帖子:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/2cbf9c7c-f562-4028-9673-d8e5cdf0dc77/

    更多的有关VSTOFAQ,请看:

    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:46
    版主
  • 1.1 .NET Framework最大的好处是什么?

    Microsoft .NET Framework 是一个 Microsoft Windows 组件,Windows 用户可通过各种分发渠道获得它。
    这些分发渠道包括 Microsoft Update 网站和 Microsoft 下载中心。该组件还安装在一些新的计算机上。
    本文论述在计算机上安装 .NET Framework 的好处:
    http://support.microsoft.com/kb/829019


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:47
    版主
  • 1.2 .NET Framework的支持生命周期是什么?

    .NET Framework 1.0:
    http://support.microsoft.com/lifecycle/?p1=1248
    .NET Framework 1.1:
    http://support.microsoft.com/lifecycle/?p1=1249
    .NET Framework 2.0:
    http://support.microsoft.com/lifecycle/?p1=8291
    .NET Framework 3.0:
    http://support.microsoft.com/lifecycle/?p1=12292 
    更多信息,查阅: Support Lifecycle Index


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:47
    版主
  • 1.3 在哪里可以找到.NET Framework部署指南?

    下面的帖子包含了.NET Framework 1.0/1.1/2.0/3.0/3.5部署指南:
    http://social.msdn.microsoft.com/Forums/en-US/netfxsetup/thread/dbb5f8c4-919a-4587-a39c-16733311db38
    .NET Framework 3.5 部署指南(针对应用程序开发人员)
    http://msdn2.microsoft.com/en-us/library/cc160716.aspx
    .NET Framework 3.5 部署指南(针对管理员)
    http://msdn2.microsoft.com/en-us/library/cc160717.aspx
    .NET Framework 3.0 部署指南
    http://msdn2.microsoft.com/en-us/library/aa480173.aspx
    .NET Framework 2.0 部署指南
    http://msdn2.microsoft.com/en-us/library/aa480237.aspx
    .NET Framework 1.1 部署指南
    http://msdn2.microsoft.com/en-us/library/ms994339.aspx
    .NET Framework 1.0 部署指南
    http://msdn2.microsoft.com/en-us/library/ms994336.aspx
    注意:
    .NET Framework Version 1.0是Tablet/Media Center版Windows操作系统的一部分。
    .NET Framework version 1.1Windows2003 Server操作系统的一部分。
    .NET Frameworks Version 2.0以及3.0版Windows Vista操作系统的一部分。

    关于.NET Framework部署的延伸阅读和额外想法,参阅:http://blogs.msdn.com/astebner/articles/574618.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:48
    版主
  • 1.4 如何移除.NET Framework?

    如果您无法在添加/删除中移除.NET Framework,建议使用.NET Framework cleanup工具。
    更新 2009年7月:更新.NET Framework cleanup以及校验工具的Windows 7支持:

    http://blogs.msdn.com/astebner/archive/2009/07/27/9850215.aspx
    http://blogs.msdn.com/astebner/archive/2007/12/04/6659905.aspx(旧版)
    更新资料(2008年8月28日): .NET Framework cleanup tool 链接:

    http://go.microsoft.com/fwlink/?LinkID=121918

    .NET Framework cleanup 现在支持移除下面的产品:
    .NET Framework - 所有版本
    .NET Framework - 所有版本 (Tablet PC 以及 Media Center)
    .NET Framework - 所有版本 (Windows Server 2003)
    .NET Framework - 所有版本 (Windows Vista 以及 Windows Server 2008)
    .NET Framework 1.0
    .NET Framework 1.1
    .NET Framework 2.0
    .NET Framework 3.0
    .NET Framework 3.5

    为.NET Framework 4使用的更新版.NET Framework cleanup以及校验工具:http://blogs.msdn.com/b/astebner/archive/2010/05/13/10012778.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:48
    版主
  • 1.5 如何校验.NET Framework安装?

    为.NET Framework 4使用的更新版.NET Framework cleanup以及校验工具:http://blogs.msdn.com/b/astebner/archive/2010/05/13/10012778.aspx
    更新 2009年7月: 更新.NET Framework cleanup以及校验工具的Windows 7支持: http://blogs.msdn.com/astebner/archive/2009/07/27/9850215.aspx
    .NET Framework Setup Verification Tool 用户指南
    http://blogs.msdn.com/astebner/pages/8999004.aspx
    信息更新 (2008年10月13日): .NET Framework setup verification tool可以在下面的地址下载到:
    http://astebner.sts.winisp.net/Tools/netfx_setupverifier_new.zip
    http://cid-27e6a35d1a492af7.skydrive.live.com/self.aspx/Blog%7C_Tools/netfx%7C_setupverifier%7C_new.zip

    .NET Framework cleanup现在支持移除下面的产品:
    .NET Framework 1.0
    .NET Framework 1.1
    .NET Framework 2.0
    .NET Framework 2.0 SP1
    .NET Framework 2.0 SP2
    .NET Framework 3.0
    .NET Framework 3.0 SP1
    .NET Framework 3.0 SP2
    .NET Framework 3.5
    .NET Framework 3.5 SP1


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:48
    版主
  • 1.6 .NET Framework 3.5是什么?

    Microsoft .NET Framework 3.5在.NET Framework 2.0 和 3.0基础上增加了很多新功能,而且包含了.NET Framework 2.0 service pack 1以及.NET Framework 3.0 service pack 1。

    .NET Framework 3.0 中增加了不少新功能,例如 Windows Workflow Foundation (WF)、Windows Communication Foundation (WCF)、Windows Presentation Foundation (WPF) 和 Windows CardSpace,.NET Framework 3.5 在这些新增功能的基础上增量构建而成。

    此外,.NET Framework 3.5 还包含若干技术领域中的大量新功能,它们以新程序集的形式添加,以避免重大更改。这些新功能包括:

    • 与语言集成查询 (LINQ) 和数据感知紧密集成。借助这个新功能,您可以使用相同的语法,在任何支持 LINQ 的语言中编写相关代码,以筛选和枚举多种类型的 SQL 数据、集合、XML 和数据集,以及创建它们的投影。
    • 利用 ASP.NET AJAX 可以创建更有效、更具交互性、高度个性化的 Web 体验,这些体验在所有最流行的浏览器上都能实现。
    • 用于生成 WCF 服务的全新 Web 协议支持,包括 AJAX、JSON、REST、POX、RSS、ATOM 和若干新的 WS-* 标准。
    • Visual Studio 2008 中面向 WF、WCF 和 WPF 的完整工具支持,其中包括支持工作流的服务这一新技术。
    • .NET Framework 3.5 基类库 (BCL) 中的新类可满足许多常见的客户请求。

    更多资源,请查阅:
    MSDN 链接:
    .NET Framework 3.5 体系结构
    http://msdn2.microsoft.com/en-us/library/bb822049.aspx

    一个很好的博客解释:
    .NET Framework 3.5
    http://www.danielmoth.com/Blog/2007/06/net-framework-35.html

    还有论坛讨论:
    http://forums.msdn.microsoft.com/en-US/netfxsetup/thread/8da540d4-4615-4842-9f1d-5827bef061ef/


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:49
    版主
  • 1.7  .NET 2.0/3.0 sp1中修复了哪些问题?

    它们在下列文档中列出:
    .NET Framework 2.0 Service Pack 1 中所修复的问题
    .NET Framework 3.0 Service Pack 1 中所修复的问题


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:50
    版主
  • 1.8 从哪里可以获得.NET Framework故障排除指南?

    Aaron Stebner有一篇 “Unified .NET Framework Troubleshooting Guide”:
    http://blogs.msdn.com/astebner/articles/454956.aspx

    以及.NET Framework 3.5特定:
    http://blogs.msdn.com/astebner/archive/tags/.NET+Framework+3.5+setup+and+deployment/default.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:50
    版主
  • 1.9 从哪里可以获取.NET Framework安装日志文件?

    以下文章讨论了日志文件是什么,在哪里找到日志文件:

    .NET Framework 3.5 安装日志文件
    http://blogs.msdn.com/astebner/archive/2007/07/31/4156781.aspx
    更新 (2008年4月30日): .NET Framework 2.0 SP1, .NET Framework 3.0 SP1 日志文件, 查阅:http://blogs.msdn.com/astebner/archive/2008/04/30/8445569.aspx

    .NET Framework 3.0 安装日志文件
    http://blogs.msdn.com/astebner/archive/2006/10/30/net-framework-3-0-setup-log-files.aspx

    .NET Framework v2.0 日志文件
    http://blogs.msdn.com/astebner/articles/447012.aspx

    .NET Framework v1.1 日志文件
    http://blogs.msdn.com/astebner/articles/447004.aspx

    .NET Framework v1.0 日志文件
    http://blogs.msdn.com/astebner/articles/447001.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:50
    版主
  • 1.10 如果其他.NET Framework安装故障排除步骤不起作用,我应该做什么?

    将您的系统恢复到一个已知的状态是非常有帮助的,然后重新安装.NET Framework以及适用于它的任何修复补丁或者补丁包:
    http://blogs.msdn.com/astebner/archive/2008/03/07/8108332.aspx

    这里还有一篇KB文章:当您尝试安装一个更新的.net Framework 1.0,1.1,2.0,3.0,或 3.5,您也可能会收到 PerformancePoint Planning 管理控制台更新的错误代码"0x643"或 PerformancePoint Planning 管理控制台安装程序错误代码"1603"
    http://support.microsoft.com/?id=923100


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:51
    版主
  • 2.1 如何解决一般的“Windows Installer”问题?

    下面的链接可以帮您解决Windows Installer的一般问题:
    http://support.microsoft.com/kb/555175


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:51
    版主
  • 2.2 有哪些其他安装相关和故障处理的工具?

    它们在下面列出:
    • msiinv.exe :
    http://www.huydao.net/setup/msiinv.zip

    这个工具(代表了MSI Inventory)包装了一些公共的、文档化的MSI APIs,来提供关于所有Windows Installer认为您计算机中安装了的Windows Installer产品,功能和组件的状态信息。

    更多信息,参考: http://blogs.msdn.com/astebner/archive/2005/07/01/using-msiinv-to-gather-information-about-what-is-installed-on-a-computer.aspx

    • Windows Installer Cleanup Utility:
    http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe

    利用Windows Installer CleanUp Utility, 您可以移除一个程序里的Windows Installer配置信息。当你遇到安装(配置)问题时,您可能想要移除您程序中的Windows Installer配置信息。

    更多信息,参考:
    Windows Installer CleanUp Utility 的介绍 http://support.microsoft.com/kb/290301

    • .NET Framework cleanup tool:
    http://astebner.sts.winisp.net/Tools/dotnetfx_cleanup_tool.zip

    它是用来清理.NET Framework的。

    更多信息,参考: http://blogs.msdn.com/astebner/archive/2007/12/04/6659905.aspx

    • File Checksum Integrity Verifier utility:
    http://support.microsoft.com/kb/841290

    它是一个计算和校验文件的MD5或SHA-1加密哈希值的命令提示行工具,通常用于校验下载文件的完整性。
    • Collect.exe:
    http://blogs.msdn.com/heaths/attachment/8483493.ashx(新版)
    http://astebner.sts.winisp.net/Tools/Collect.zip(旧版)

    它被用于收集日志信息。

    这是一个Win32控制台应用程序,你可以从zip文件中解压并双击以运行它。当它收集到所有的日志文件后,它会在您的系统中生成一个名为%temp%\vslogs.cab的文件。

    注意 - 当这个工具运行完成后,通过点击开始菜单,选择运行,输入%temp%并单击确定,可以在%TEMP%文件夹中找到vslogs.cab文件。
    (当运行收集工具时,可能需要一些时间来收集你的机器上的日志文件工具,请耐心等待。)

    更多信息,参考:
    http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx(新版)
    http://blogs.msdn.com/astebner/archive/2007/08/01/4172276.aspx(旧版)

    May 20, 2009, 更新: 介绍了一个新的收集工具 http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx
    它也能用于处理Visual Studio 2010 Beta 1 和 .NET Framework 4.0 Beta 1安装日志。

    • 至于其他工具,有更多工具在:
    http://www.microsoft.com/technet/sysinternals/default.mspx

    例如Process Explorer, Process Monitor, Register Monitor, Autoruns,它们都非常有用。

    参阅:
    Sysinternals Process Utilities: http://technet.microsoft.com/en-us/sysinternals/cb56073f-62a3-4ed8-9dd6-40c84cb9e2f5.aspx
    Sysinternals File and Disk Utilities: http://technet.microsoft.com/en-us/sysinternals/bb545046.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:52
    版主
  • 1. 规则1

    禁用您的反病毒软件
    禁用您的反病毒软件是第一步必须要进行的。虽然一些反病毒软件不会干扰安装而且很“聪明”,大部分的反病毒软件是这样的,特别是McAffe。它们只是做它们的工作来防止任何程序/应用安装到您的系统。这是一个好的安全措施,不过您如果了解您将要安装的软件,这里是Visual Studio,是可以信任的话,则继续安装。
    有些反病毒软件会提示您是否希望继续并让软件脚本/安装运行 - 这种情况下选择是并继续。不幸的是有些反病毒软件不是这样的,而且看起来什么事情也没有发生,例如甚至让它运行5个小时,您会发现不管怎么样都没有取得任何进展。
    所以总而言之,最好就是禁用掉您的反病毒软件,并且切断互联网连接来防止任何病毒或恶意项目进入您的计算机,这只是作为一个额外的安全措施。毕竟,这是反病毒软件做的 - 它防止(并移除)这种致命的野兽进入您的计算机并感染您的系统。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:52
    版主
  • 2. 规则2

    更新您的计算机 (Windows)
    确定系统被“修补”起来。Windows更新( http://windowsupdate.microsoft.com/) 为Windows操作系统找到并安装任何关键“修复”和补丁。这有时有助于安装安装正确。虽然这可能不会100%保证,不过最好保持您的系统是最新的,来确保您远离任何的bug或类似的东西。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:52
    版主
  • 3. 一般注意事项

    Microsoft建议,而且您可能应该从过去经验中知道不要安装Beta产品(任何的beta,从Windows操作系统,office,补丁包等等)在您的主计算机,甚至您的商业环境。正如它正处于测试的意思,支持非常的有限近乎于无,正在开发中而且可以预料到其中有不少的bug。

    Beta版本是为了您的益处而创建的 - 这些益处是给您来对产品先睹为快,并获得您,用户/客户的一些反馈,以便Microsoft能够改进产品。Microsoft是一家非常以客户为基础/导向的公司,来自于您,用户的反馈,使非常关键和重要的。

    我们建议您在安装产品的“最终”版之前,移除任何可能存在问题的Beta版产品。这样可以避免您在安装或使用应用程序时遇到任何失败。

    大多数时候,测试版移除工具箱/工具是Microsoft发布的,用来完全移除任何测试版产品的痕迹,即使在卸载它之后。这将确保安装和使用“最终”版产品尽可能的顺利。

    例如,Visual Studio 2005 beta removal kit位于 这里(更多的信息在 这里),而且应当在安装完整/最终版Visual Studio之前使用它。

    为以防万一,即使没有提示需要重新启动,也请务必重新启动系统。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:53
    版主
  • 4. 有些文件在安装过程中没有被复制(文件错误...)

    有时候安装可能会提示您重新把CD/DVD插入光驱,因为它无法找到为成功安装产品所需要的一个指定文件。您可能已经放入了CD,但它依旧提示需要CD。
    如果您的Visual Studio是一组CD,为了继续安装过程,请确认插入了下一张正确的CD。

    无论是CD/DVD安装,如果问题仍然存在的话,这里有一些可以尝试的步骤来克服这个问题:

    如上所述,确保在安装期间禁用了反病毒软件。

    尝试使用一个不同的CD/DVD光驱来安装 - 有时处理媒体时,光驱比其他的设备要更敏感,这只是他们被制造的方式。 也可能是因为您的光驱即将报废(不过这不太可能,除非这种情况发生在您大部分的CD/DVD上)....

    为CD/DVD创建一个ISO镜像。这可以通过使用例如,Nero Burning ROM,为CD/DVD创建一个ISO镜像。这样做可以帮助我们察看是否实际的媒体或一些相关的东西存在问题。
    创建好ISO镜像后,或者:

    使用例如ISOBuster的工具,把您刚才创建的ISO镜像解压到本地计算机中,然后从您的硬盘驱动器/硬盘运行安装程序。

    使用如MSVCD这样的第三方工具,把ISO镜像挂载到虚拟光驱中,然后从虚拟光驱运行安装程序。

    如果以上的步骤无效,请在一台不同的计算机上尝试安装。是否可以正常工作?如果不可以,很可能安装媒体存在故障/损坏,这时您需要回到您获得产品的地方并解释当前的情况。他们应该能够帮助您。

    对于有这个问题的MSDN订阅者/订阅服务器,请联系您当地的支持中心。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:53
    版主
  • 5. 如何安装Visual Studio CD/DVD镜像文件

    镜像文件通常后缀是ISO或IMG。它们是CD/DVD媒体的一个实际镜像。这样的镜像是从MSDN订阅网站或者Microsoft网站提供的试用版,例如Visual Studio 2005 90天试用版,下载的。

    一旦下载了这些文件,您所需要做的是或者:
    使用例如Nero这样的软件把镜像烧录到DVD/CD。
    使用第三方工具(如ISOBuster)把镜像内容解压,并从计算机运行安装。
    使用第三方的虚拟光驱挂载工具,例如MSVCD,把镜像挂载到虚拟光驱中,这样您可以像从真正的CD/DVD中运行它一样,运行安装/文件。

    可以这三种方法中的任何一种来(最终)运行产品的安装。

    希望这些项目会足够让您开始Visual Studio 2005的安装。所有的这些,除了最后一点,一般适用于任何产品,并不仅仅是Visual Studio 2005。
    如果您仍然有问题的话,请随时提出一个新的问题,给出下面的详细信息:

    您正在运行的操作系统版本
    是哪一个.NET Framework?
    是哪一个版本的Visual Studio?
    Visual Studio产品报告的任何错误以及错误日志。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:54
    版主
  • 1.1 Visual Studio不同版本间有什么区别?

    你可以参考以下文档:
    Visual Studio 2005 产品线概述
    http://msdn2.microsoft.com/en-us/vstudio/aa700921.aspx
    Visual Studio 2005 Team Edition 比较
    http://msdn2.microsoft.com/en-us/teamsystem/aa718806.aspx
    Visual Studio 2008 产品比较
    http://msdn2.microsoft.com/en-us/vsts2008/products/cc149003.aspx
    更新:这里是一些下载版本(DOCX/XPS/PDF): Visual Studio 2008 Product Comparison downloads


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:55
    版主
  • 1.2 最好的安装Visual Studio的方式是什么?

    下面的帖子中有一些安装Visual Studio 的一般技巧:

    http://forums.msdn.microsoft.com/en-US/vssetup/thread/60f71a54-506e-4c70-be98-e993ce6d1ddf/


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:55
    版主
  • 1.3 如应该如何卸载预览版Visual Studio(CTPs或Betas)?

    下面的帖子是论坛编制的关于如何卸载不同预发行版本Visual Studio 2005的资源清单:
    http://forums.msdn.microsoft.com/en-US/vssetup/thread/94f227ba-0e88-437f-936a-afffd5236b8c/
    这个是来自MSDN的建议:
    卸载Visual Studio 2005以前的版本
    http://msdn.microsoft.com/en-us/express/aa718405.aspx
    卸载Visual Studio 2008以前的版本
    http://msdn2.microsoft.com/en-us/vs2008/bb964521.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:56
    版主
  • 1.4 我应该怎么样移除Visual Studio?

    下面的链接提供了一个自动工具以及手动卸载Visual Studio 2008的步骤:
    卸载Visual Studio 2008 (注意:这个工具不会卸载.NET Framework 3.5):
    http://msdn2.microsoft.com/en-us/vs2008/bb968856.aspx
    (注意:要获取自动卸载工具,请参考 http://cid-75a4db78b1d41bb2.skydrive.live.com/self.aspx/.Public/UninstallTool%5E_VS.rar

    对于Visual Studio 2005您可以参考以下文档:
    如何:卸载 Visual Studio(2005)
    http://msdn2.microsoft.com/en-us/library/ms246604(VS.80).aspx
    如何删除 Visual Studio 2005
    http://support.microsoft.com/kb/907965

    对于早期版本:
    如何删除 Visual Studio.net 2003
    http://support.microsoft.com/kb/824642
    如何手动移除Visual Studio .NET 2002组件
    http://support.microsoft.com/kb/320114


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:56
    版主
  • 1.5 当Visual Studio IDE遇到意想不到的问题时应该做什么?

    当未料到的异常出现时,关键点是尝试找出潜在原因。所以把情境做到越简单越好。

    当Visual Studio IDE未按照预期工作时,我们可以尝试:
    a)     尝试运行 devenv /ResetSettings (在命令提示符中)以消除潜在的相关设置问题。

    b)     尝试禁用插件 (e.g. “Tools” | “Add-in Manager”) 或运行 “devenv.exe /SafeMode”。这可以消除第三方插件或程序包造成问题到可能。(更多关于VS命令行开关的信息,参见:http://msdn2.microsoft.com/en-us/library/xee0c8y7.aspx

    c)     尝试创建一个新项目。有时错误的项目设置会引起问题。他们是项目特定的。

    d)     确保我们安装了最新的补丁包。
    例如,Visual Studio 2005, 请参考Microsoft® Visual Studio® 2005 Team Suite Service Pack 1http://www.microsoft.com/downloads/details.aspx?FamilyId=BB4A75AB-E2D4-4C96-B39D-37BAF6B5B1DC(这个下载会为Microsoft® Visual Studio® 2005 Standard, Professional, Team Editions安装Service Pack 1) 或Microsoft® Visual Studio® 2005 Express Editions Service Pack 1 http://www.microsoft.com/downloads/details.aspx?FamilyId=7B0B0339-613A-46E6-AB4D-080D4D4A8C4E(这个下载会为Microsoft® Visual Studio® 2005 Express Editions安装Service Pack 1)

    e)     尝试重启操作系统并进入安全模式。这样可以帮助确认是否有任何其他应用干扰了Visual Studio。 注意有些功能(如IIS)在安全模式下是不可用的。 请检查它是否是可用的。除了安全模式外,我们也可以尝试“干净启动”:如何将 Windows XP 配置为以“干净启动”状态启动http://support.microsoft.com/kb/310353

    f)      尝试创建一个新的用户帐户。 这样可以帮助隔绝用户配置文件错误相关的原因。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:56
    版主
  • 1.6 从哪里找到Visual Studio管理员部署指南?

    Visual Studio 2008管理员部署自述文档, 请访问http://go.microsoft.com/fwlink/?LinkID=101063
    对于Microsoft Visual Studio 2005,参看 http://support.microsoft.com/kb/907759
    对于Microsoft Visual Studio 2003,参看 http://support.microsoft.com/kb/327792
    对于Microsoft Visual Studio 2002,参看 http://support.microsoft.com/kb/309657


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:57
    版主
  • 1.7 从哪里获得Visual Studio以及.NET Framework的安装日志文件?

    以下文章讨论了日志文件是什么,在哪里找到日志文件:

    Visual Studio 2008 与 .NET Framework 3.5 安装日志文件
    http://blogs.msdn.com/astebner/archive/2007/07/31/4156781.aspx

    .NET Framework 3.0 安装日志文件
    http://blogs.msdn.com/astebner/archive/2006/10/30/net-framework-3-0-setup-log-files.aspx

    Visual Studio 2005 与 .NET Framework v2.0 安装日志文件
    http://blogs.msdn.com/astebner/articles/447012.aspx

    Visual Studio .NET 2003 与 .NET Framework v1.1 日志文件
    http://blogs.msdn.com/astebner/articles/447004.aspx 

    Visual Studio .NET 2002 与 .NET Framework v1.0 日志文件
    http://blogs.msdn.com/astebner/articles/447001.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:57
    版主
  • 1.8 如何解决Visual Studio 2005安装过程的问题?

    Aaron Stebner在他的博客中提供了一个非常好的的问题处理指导:
    Visual Studio 2005 与 .NET Framework 2.0 安装故障排除指南
    http://blogs.msdn.com/astebner/articles/492809.aspx

    你也可以在以下KB文章中找到一些有用的信息:
    如何对 Visual Studio 2005 的安装进行故障排除
    http://support.microsoft.com/kb/904732


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:58
    版主
  • 1.9 已知的Visual Studio 2005 Service Pack 1安装问题有哪些?

    Heath Stewart在他的博客中写了一些安装VS 2005 SP1时已知的问题:
    http://blogs.msdn.com/heaths/archive/2007/01/11/known-issues-with-visual-studio-2005-service-pack-1.aspx
    他在其中使用了很多标签,你可以从下面找到与VS 2005 SP1相关的文章集合:
    http://blogs.msdn.com/heaths/archive/tags/VS+2005+SP1/default.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:58
    版主
  • 1.10 已知的Visual Studio 2005在Windows Vista上的问题有哪些?

    你可以找到如下列出的已知问题:
    Windows Vista上的Visual Studio 2005问题列表
    http://msdn2.microsoft.com/en-us/vstudio/aa964140.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 3:58
    版主
  • 1.11 Visual Studio 2008有哪些新特性?

    Visual Studio 2008与.NET Framework 3.5功能规格
    http://msdn2.microsoft.com/en-us/vstudio/aa948851.aspx 

    还有一些其他博客文章谈论新特性:

    Visual Studio 2008与Microsoft .NET Framework 3.5的新特性
    http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx
    Visual Studio 2008与Microsoft .NET Framework 3.5的新特性
    http://blogs.msdn.com/dougste/archive/2007/11/02/new-features-of-visual-studio-2008-and-microsoft-net-framework-3-5.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us


    2012年4月17日 3:59
    版主
  • 1.12 解决Visual Studio 2008安装问题的通用步骤是什么?

    1.    确保在你的机器上已经卸载了所有预发行组件(Beat或CTP版):
    卸载Visual Studio 2008 之前的版本:
    http://msdn2.microsoft.com/en-us/vs2008/bb964521.aspx

    2.    安装所有来自Windows Update网站的最新Windows更新: http://windowsupdate.microsoft.com/ 

    3.    检查是否有任何反病毒或反间谍应用程序在运行。确保在安装期间它们是关闭的。

    4. 确保安装媒体是完好的。如果通过光驱安装不正确的话,你可以把光盘内容复制到硬盘,再尝试从硬盘安装。

    5.    在安装之前完成或消除Windows更新(但要打开Windows更新服务)。

    6.    如果安装过程失败 ,你可以收集安装日志并加以分析。
    清空临时文件夹(打开开始菜单 | “运行” 并运行“%TEMP%”,去掉引号)并再次安装。日志文件将会在临时文件夹中生成。

    你可以利用这里的日志收集工具:
    http://blogs.msdn.com/heaths/attachment/8483493.ashx
    注意 - 运行完这个工具之后,通过点击“开始”菜单,选择运行,并运行“%TEMP%”(去掉引号),可以在%TEMP%文件夹中找到vslogs.cab文件。运行这个来收集你的机器上的日志文件工具可能需要一些时间。请耐心等待。

    更多信息,请查看:Visual Studio 与 .NET Log Collection Utility
    http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx

    7.    尝试使用Process Monitor来跟踪是否有任何文件/注册表访问相关问题。
    Process Monitor:
    http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/processmonitor.mspx
    日志文件可能会很大,你可以利用“Filter”功能过滤结果。

    相关帖子: http://forums.msdn.microsoft.com/en-US/vssetup/thread/ecb1403a-a343-43d9-92c6-a50f5bee3cf6/


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:00
    版主
  • 1.13 如何利用日志文件诊断Visual Studio 2008及.NET Framework 3.5的安装问题

    这里是一些查看Visual Studio 2008与.NET Framework 3.5安装日志的技巧 (一些通用步骤也可以用于其他的版本)。

    通过下面的文章中,你可以学到日志文件是什么,位于什么地方:
    Visual Studio 2008 与 .NET Framework 3.5 安装日志文件 http://blogs.msdn.com/astebner/archive/2007/07/31/4156781.aspx

    你也可以使用collect.exe工具收集设置日志: http://blogs.msdn.com/heaths/attachment/8483493.ashx 
    1.     通过下面的链接下载collect.exe。
    2.     你可以选择把这个工具保存下来为以后使用,也可以直接运行。
    3.     这个工具会为所有VS与.NET日志文件创建一个压缩包,位于%TEMP%\vslogs.cab。

    更多关于这个工具的信息,查看: http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx

    VS或.NET Framework设置日志里的时间戳在诊断问题的时候很有用,你可以顺序查看安装过程中发生了什么,以及错误或异常出现前发生了什么。

    例如,在Vista x86上你看到一行(在dd_dotnetfx35error.txt中)

    [12/21/07,18:51:15] Microsoft .NET Framework 2.0SP1 (CBS): [2] Error: Installation failed for component Microsoft .NET Framework 2.0SP1 (CBS). MSI returned error code 34

    Then you can check what happens before 18:51:15 in dd_dotnetfx35install.txt

    For example we see some clues from the following:

    [12/21/07,18:42:42] Microsoft .NET Framework 2.0SP1 (CBS): "C:\Windows\system32\WUSA.exe" "c:\34415d89092dd9f6afb19de1dd\wcu\dotNetFramework\dotnetmsp\x86\NetFX2.0-KB110806-v6000-x86.msu" /quiet /norestart
    [12/21/07,18:42:42] Microsoft .NET Framework 2.0SP1 (CBS): CBSComponent Action: CreateProcess launched with cmd line : C:\Windows\system32\WUSA.exe "C:\Windows\system32\WUSA.exe" "c:\34415d89092dd9f6afb19de1dd\wcu\dotNetFramework\dotnetmsp\x86\NetFX2.0-KB110806-v6000-x86.msu" /quiet /norestart
    [12/21/07,18:42:42] BWaitForMSI(): Verifying we're the only installation currently in progress.
    [12/21/07,18:42:42] BWaitForMSI(): Ready to proceed with installation.  Continuing...
    [12/21/07,18:45:13] Microsoft .NET Framework 2.0SP1 (CBS): C:\Windows\system32\WUSA.exe exited with return value 34
    [12/21/07,18:45:13] Microsoft .NET Framework 2.0SP1 (CBS): Installation failed, attempting to retry
    [12/21/07,18:45:13] InstallRetryAttempted: GFN_MID NET Framework 2.0SP1 (CBS)
    [12/21/07,18:46:13] Microsoft .NET Framework 2.0SP1 (CBS): retrying...
    [12/21/07,18:46:13] BWaitForMSI(): Verifying we're the only installation currently in progress.
    [12/21/07,18:46:13] BWaitForMSI(): Ready to proceed with installation.  Continuing...
    [12/21/07,18:47:12] Microsoft .NET Framework 2.0SP1 (CBS): C:\Windows\system32\WUSA.exe exited with return value 34
    [12/21/07,18:47:12] Microsoft .NET Framework 2.0SP1 (CBS): Installation failed, attempting to retry
    [12/21/07,18:47:12] InstallRetryAttempted: GFN_MID NET Framework 2.0SP1 (CBS)
    [12/21/07,18:48:12] Microsoft .NET Framework 2.0SP1 (CBS): retrying...
    [12/21/07,18:48:12] BWaitForMSI(): Verifying we're the only installation currently in progress.
    [12/21/07,18:48:12] BWaitForMSI(): Ready to proceed with installation.  Continuing...
    [12/21/07,18:49:11] Microsoft .NET Framework 2.0SP1 (CBS): C:\Windows\system32\WUSA.exe exited with return value 34
    [12/21/07,18:49:11] Microsoft .NET Framework 2.0SP1 (CBS): Installation failed, attempting to retry
    [12/21/07,18:49:11] InstallRetryAttempted: GFN_MID NET Framework 2.0SP1 (CBS)
    [12/21/07,18:50:11] Microsoft .NET Framework 2.0SP1 (CBS): retrying...
    [12/21/07,18:50:11] BWaitForMSI(): Verifying we're the only installation currently in progress.
    [12/21/07,18:50:11] BWaitForMSI(): Ready to proceed with installation.  Continuing...
    [12/21/07,18:51:15] Microsoft .NET Framework 2.0SP1 (CBS): C:\Windows\system32\WUSA.exe exited with return value 34

    所以问题被缩小到了高亮显示的部分… (错误返回码34通常指需要重新启动)

    建议直接从安装源安装高亮显示的部分(\wcu\dotNetFramework\dotnetmsp\x86\NetFX2.0-KB110806-v6000-x86.msu) 并重新启动机器,然后再次运行Visual Studio 2008设置. (有时为了移除之前安装留下的残留物,在本方法前使用.NET Framework cleanup tool清除.NET Framework也是必须的。)

    因为真实的案例是不同的,而且会变得复杂,对于一个特定的错误码,并没有一个明确的解决方案。
    不过,下面列出了一些通用错误码信息以及对应的可能解决方案:

    a)     MSI returned error code 34
    —    可能的解决方案:需要重新启动计算机。

    b)     Error Code 6015
    —    可能的解决方案:
    当您尝试在一个域中的基于 Windows Vista 的计算机上安装一个修补程序时出现错误消息:“安装程序遇到一个错误: 0x8007177f。用于文件加密,这台机器已停用”http://support.microsoft.com/kb/933595 
    这可能是域策略产生影响,阻止了使用加密文件系统 (EFS) 加密文件工作。

    c)     Error Code 1
    —    可能的解决方案:
    由于beta版产品或损坏的注册表,当前系统中软件包不可用: http://blogs.msdn.com/astebner/archive/2007/08/24/4548657.aspx 
    以及相关的帖子: http://forums.msdn.microsoft.com/en-US/thread/191b3373-f7fa-4d49-b320-b8632ad8d291

    d)     Error code 5 or 0x5 or 0x80070005
    —    可能的解决方案:
    通过使用SubInACL工具修复文件和注册表的权限,解决设置错误 http://blogs.msdn.com/astebner/archive/2006/09/04/739820.aspx

    e)     Error code 0x80040154
    —    类未被注册,参考:
    由于MSXML注册损坏造成可能的.NET Framework 3.5安装失败 http://blogs.msdn.com/astebner/archive/2007/11/01/5826719.aspx

    f)      0x0013EC (5100)
    —    通用设置阻止
    可能在几种不同的情况下返回这个错误代码:

    i.      运行安装的用户没有管理员权限。
    ii.     安装了一个之前的一个Beta版(处理逻辑和这里讨论的.NET Framework 2.0类似,不过产品代码储存在名为setup.sdb的文件中而不是install.ini)。
    iii.    已经安装了一个新版本的.NET Framework 3.5。
    iv.    运行安装程序的操作系统是不被支持的。
    v.     运行安装程序的操作系统没有安装最低要求的补丁包。

    g)     0x002332 (9010)
    —    安装运行前,一个挂起的重新启动必须要完成。
    如果在系统上之前的操作引起文件重命名作业计划被挂起,以将项添加到下面的注册表值时,这个错误码被返回:
    注册表根:HKEY_LOCAL_MACHINE
    注册表项:Software\Microsoft\Updates\UpdateExeVolatile
    注册表值:Flags -或- Flags_<reboot time>
    这个错误通常可以通过重新启动系统解决。如果在重启后错误仍然出现,你可以通过手动从系统注册表删除这个标志值来解决。

    更多信息,参考:.NET Framework 3.0 安装程序的返回代码 http://blogs.msdn.com/astebner/archive/2006/11/28/return-codes-for-net-framework-3-0-setup.aspx

    我们也可以在Aaron’s blog 以及 Heath’s blog上查看一些其它的返回值。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:00
    版主
  • 1.14 如何安装Visual Studio 2008 and .NET Framework 3.5(一些通用安装技巧)?

    您可以参考下面来自MSDN team blog的文章:
    http://blogs.msdn.com/msdnforum/archive/2010/03/06/visual-studio-and-net-framework-installation-tips.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:00
    版主
  • 2.1 如何解决常见“Windows Installer”问题?

    下面的链接可以帮助你解决常见的Windows Installer问题:
    http://support.microsoft.com/kb/555175


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:01
    版主
  • 2.2 有哪些其他安装相关和故障处理的工具?

    它们在下面列出:
    • msiinv.exe :
    http://cid-27e6a35d1a492af7.skydrive.live.com/self.aspx/Blog%7C_Tools/msiinv.zip
    这个工具(代表了MSI Inventory)包装了一些公共的、文档化的MSI APIs,来提供关于所有Windows Installer认为您计算机中安装了的Windows Installer产品,功能和组件的状态信息。

    更多信息,参考: http://blogs.msdn.com/astebner/archive/2005/07/01/using-msiinv-to-gather-information-about-what-is-installed-on-a-computer.aspx
    • Windows Installer Cleanup Utility:
    http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe
    利用Windows Installer CleanUp Utility, 您可以移除一个程序里的Windows Installer配置信息。当你遇到安装(配置)问题时,您可能想要移除您程序中的Windows Installer配置信息。

    更多信息,参考:
    Windows Installer CleanUp Utility 的描述  http://support.microsoft.com/kb/290301 
    • .NET Framework cleanup tool:
    http://astebner.sts.winisp.net/Tools/dotnetfx_cleanup_tool.zip

    它是用来清理.NET Framework的。

    更多信息,参考: http://blogs.msdn.com/astebner/archive/2007/12/04/6659905.aspx
    • File Checksum Integrity Verifier utility:
    http://support.microsoft.com/kb/841290

    它是一个计算和校验文件的MD5或SHA-1加密哈希值的命令提示行工具,通常用于校验下载文件的完整性。
    • Collect.exe:
    http://go.microsoft.com/?LinkId=8967044 (新版)
    http://blogs.msdn.com/heaths/attachment/8483493.ashx (旧版)
    http://astebner.sts.winisp.net/Tools/Collect.zip (旧版)

    它被用于收集日志信息。

    这是一个Win32控制台应用程序,你可以从zip文件中解压并双击以运行它。当它收集到所有的日志文件后,它会在您的系统中生成一个名为%temp%\vslogs.cab的文件。

    注意 - 当这个工具运行完成后,通过点击开始菜单,选择运行,输入%temp%并单击确定,可以在%TEMP%文件夹中找到vslogs.cab文件。
    (当运行收集工具时,可能需要一些时间来收集你的机器上的日志文件工具,请耐心等待。)

    更多信息,参考:
    http://blogs.msdn.com/heaths/archive/2009/05/22/updated-log-collection-utility-available-for-visual-studio-2010-and-net-4-0-beta-1.aspx(新版)
    http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx(旧版)
    http://blogs.msdn.com/astebner/archive/2007/08/01/4172276.aspx(旧版)
    • 至于其他工具,有更多工具在:
    http://www.microsoft.com/technet/sysinternals/default.mspx
    例如Process Explorer, Process Monitor, Register Monitor, Autoruns,它们都非常有用。

    参阅:
    Sysinternals Process Utilities: http://technet.microsoft.com/en-us/sysinternals/cb56073f-62a3-4ed8-9dd6-40c84cb9e2f5.aspx
    Sysinternals File and Disk Utilities: http://technet.microsoft.com/en-us/sysinternals/bb545046.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:01
    版主
  • 1. 怎样配置Visual Studio 来调试.NET Framework源代码?

    1.下载并安装Visual Studio SP1

    2.点击“工具”->“选项”…->“调试”->“常规”。

    3.清除“启用‘仅我的代码’(仅限托管)”选项。

    4.选择“启用.NET Framework源代码逐步”选项。

    5.选择“源服务器支持”选项。

    6.选择符号。

    7.点击在右边板块中的新建文件夹图标,然后按回车:

    http://referencesource.microsoft.com/symbols

    8.指定一个本地文件夹来存储符号文件。

    更多关于配置Visual Studio来调试.NET Framework源代码的信息:

    Visual Studio 2008 SP1(安装程序)

    http://www.microsoft.com/downloads/details.aspx?FamilyID=FBEE1648-7106-44A7-9649-6D9F6D58056E&displaylang=en

    Visual Studio 2008 SP1(标准版)

    http://www.microsoft.com/downloads/details.aspx?FamilyID=27673c47-b3b5-4c67-bd99-84e525b5ce61&displaylang=en

    配置Visual Studio来调试.NET Framework源代码:

    http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:02
    版主
  • 2. 怎样配置Visual Studio 来使用微软符号服务器

    1.下载并安装Visual Studio SP1

    2.点击“工具”->“选项”…->“调试”->“常规”。

    3.不选“启用‘仅我的代码’(仅限托管)”选项。

    4.选择“启用.NET Framework源代码逐步”选项。

    5.选择“源服务器支持”选项。

    6.选择符号。

    7.点击在右边板块中的新建文件夹图标,然后按回车:

    http://referencesource.microsoft.com/symbols

    在本地符号文件(.pdb)里


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:02
    版主
  • 3. 微软符号服务器pdb文件和微软引用源服务器的区别?

    微软符号服务器和微软引用源服务器的不同是,微软符号服务器提供没有源信息的符号,而引用源服务器提供带有全部调试信息的符号。因此,你可以用引用源服务器的符号调试.NET框架源代码。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:02
    版主
  • 4. 怎样在Visual Studio 2005/2008中对传统的ASP应用程序调试?

    不同于基于操作系统和IIS,下面有详细的步骤来在IIS5中调试传统的ASP应用程序。

    1. 打开Visual Studio,点击“文件”->新建网站…。

    2. 在新建网站对话框中,创建一个web应用程序,命名然后“点击”打开按钮。

    3. 在打开的对话框中单击本地IIS标签。

    4. 打开IIS管理器(开始->控制面板->管理工具->Internet信息服务管理器)。

    5. 扩展网站节点,默认网站节点,找到你第3步创建的Web应用程序。

    6. 右键单击项目名选择属性。

    7. 选择上面的目录标签,然后找到配置按钮,单击。

    8. 在打开的对话框中,选择调试标签。

    9. 选择启用ASP服务器端脚本。

    10.进入Visual Studio,在项目中加入页面,设置断点。

    11.设置起始页面调试,然后按Ctrl+F5无调试开始。

    12.单击“工具”->“附加到进程”(Ctrl+Alt+P)打开附加到进程对话框。

    13.在可用进程部分中找到dllhost.exe单击附加按钮。

    14.刷新页面或者得到该断点。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:03
    版主
  • 5. 怎样在IIS6中对传统的ASP程序启用脚本调试?

    1. 打开Internet信息服务管理器6IIS6)。

    2. 选择特征视图,然后在中间板块的IIS部分中找到ASP图标。

    3. 双击打开它,然后在编译部分中找到调试属性。

    4. 设置启用客户端调试。

    5. 设置启用服务器端调试。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:03
    版主
  • 6. 怎样使用Visual Studio2008调试存储过程?

    1. 打开Visual Studio然后创建一个SQL Server项目(文件->新建->项目->数据库项目)

    2. 弹出一个对话框,然后要求加入一个数据库引用,选择NORTHWIND数据库。

    3. 在对话框中单击“Yes”按钮,然后在Visual Studio中建好了一个项目。

    4. 在项目中加入一个存储过程名为MyStoredProcedure(默认在项目中产生一个MyStoredProcedure.cs文件)。

    5. 在存储过程中写代码,例如:

    public partial class StoredProcedures

    {

       [Microsoft.SqlServer.Server.SqlProcedure]

       public static void SimpleStoredProcedure(SqlString name)

       {

           using (SqlConnection conn = new SqlConnection("context connection=true"))

           {

               String sql = string.Format("Insert into [TableName] (FieldName, ...) values ('{0}', ...)", name);

               SqlCommand cmd = new SqlCommand(sql, conn);

               try

              {

                   conn.Open();

                   cmd.ExecuteNonQuery();

               }

               catch (Exception ex)

               {

               }

           }       

       }

    };

    6. Test.sql文件中写测试指令,例:

    Exec SimpleStoredProcedure’testname’

        Select * from[TableName] where [FieldName]=’testname’.

    7. 右键单击项目,建立和部署。

    8. 打开服务器资源管理器,存储过程被创建。

    9. 右键单击存储过程名称,选择“插入存储过程”。

    关于SQL/CLR调试更多的信息:

    怎样调试一个SQL CLR存储过程:

    http://msdn.microsoft.com/en-us/library/ms165051(VS.80).aspx

    SQL Server2005T-SQLCLR调试的概述:

    http://blogs.msdn.com/sqlprogrammability/archive/2006/04/29/586495.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:04
    版主
  • 7. 怎样用Visual Studio 2008实现远程调试?

    假设在远程计算机上正运行一个windows窗体应用程序,远程机器和本地机器在同一个域里。确定你在两台机器上有相同的账户和密码,它们都有管理员权限,你根据下面的步骤实现Visual Studio远程调试。

    1. 用同样的账户和密码登陆到远程计算机。

    2. 在远程计算机上运行远程调试监视器(位于C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\x86

    注意:确定你运行正确的远程调试监视器,最好复制本地机器上的一份到远程机器上。

    3. 在远程机器上运行windows窗体应用程序。

    4. 打开当地机器上的Visual Studio 2008.

    5. 单击“工具”->打开附加进程对话框附加进程

    6. 在远程机器上的远程调试监视器中找到服务器名字,然后在本地机器上的Qualifier框中加入它。

    7. 在可用进程中找到window窗体进程,指定正确的代码类型,然后单击附加按钮。

    8. 在远程机器上运行应用程序然后得到断点中断。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:04
    版主
  • 8. 怎样实现一个自定义调试器可视化工具?

    Visual Studio 2005Visual Studio2008都有一个模板叫调试器可视化工具,创建一个自定义调试器可视化工具,你能重写模板的Show方法,下面是一个演示来创建一个自定义类型的自定义调试器可视化工具

    1. 创建一个类库项目,然后添加两个类,例如StudentOurClass。它们是你想要在调试器可视化工具中使用的自定义类型。

          namespace TestVisualizer

    {

        [Serializable]

       public class Student    {.....}

        [Serializable]

       public class OurClass    {.....}

    }

    2. 创建另一个类库项目,在项目中添加一个调试器可视化工具项(再前一个项目中添加引用)

          [assembly: System.Diagnostics.DebuggerVisualizer(typeof(CustomVisualizer.OurClassVisualizer),

    Target = typeof(TestVisualizer.OurClass), Description ="Custom Visualizer")]

    namespace CustomVisualizer

    {

       public class OurClassVisualizer : DialogDebuggerVisualizer

       {

              protectedoverride void Show(IDialogVisualizerService windowService,

             IVisualizerObjectProvider objectProvider)

            {

                   OurClass oc = (OurClass)objectProvider.GetObject();

                   using (VisualizerForm displayForm =new VisualizerForm())

                 {

                     displayForm.list = oc.ClassList;

                     displayForm.average = oc.AverageAge;

                     windowService.ShowDialog(displayForm);

                 }

            }

    3.实现VisualizerForm类,右键单击项目名然后加入一个windows form类,拖拽一些控件(一个DataGridViewLabel控件),双击窗体,加入如下代码片段:

    publicpartial class VisualizerForm : Form

    {

           public VisualizerForm()

            {

                InitializeComponent();

            }

           public List<Student> list =null;

           public int average = 0;

           private void VisualizerForm_Load(object sender,EventArgs e)

            {

               this.lblage.Text = average.ToString();

               this.dataGridView1.DataSource = list;

              this.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);

            }

    }

    4. 建一个项目,复制dll文件到文件夹

    \Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers

    \My Documents\Visual Studio 2008\Visualizers

    5.创建一个Windows Forms项目来测试这个可视化工具,在断点中断后,移动光标到变量上,单击图标,我们的可视化工具出现了。

    更多的信息关于怎样实现一个调试器可视化工具,请参照:

    怎样写一个可视化工具:

    http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

    怎样写一个自定义的可视化工具:

    http://blogs.msdn.com/deeptanshuv/archive/2005/03/21/400194.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:04
    版主
  • 9. 怎样在Visual Studio2008中关闭JavaScript代码自动调试?

    在安装完InternetExplorer8后,脚本代码调试是默认的,然而,在一些情况下,你不必调试脚本代码。下面是一些关闭自动调试JavaScript的操作:

    1. 操作一:

    1) 开始运行(不调试)(按 Ctrl+F5)。

    2) 附加WebDev.WebServer.exe进程到Visual Studio调试器

    2. 操作二:

    1) 右键单击Web应用程序选择属性。

    2) 单击左面的Web标签然后在左边的部分选择“不打开页”单选按钮。

    3) 开始运行调试(并按F5)。

    4) 打开Internet Explorer然后前往到网址。

    3. 操作三:

    1) 打开应用程序属性页选择Web标签。

    2) 单击“启用外部程序”单选按钮,然后输入路径到iexplorer.exe

    3) 在“命令行参数”中输入网址。

    4) F5运行调试。

    更多关于关闭脚本调试信息,请参考:

    VS2008+IE8中关闭脚本调试:

    http://blogs.msdn.com/greggm/archive/2009/04/06/disabling-script-debugging-in-vs-2008-ie8.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:05
    版主
  • 10. 怎样解决“symbol file could not be found”问题?

    1. 确保Visual Studio被配置正确才调试.NET Framework源代码。

    2. 打开模块窗口(调试->Windows->模块),看模块中pdb文件是否被正确载入。

    3. 如果“符号状态”列显示无符号载入,右键单击模块名选择载入符号窗体->符号服务器/符号路径载入符号。

    右键单击模块名,选择符号加载信息检查在模块中调试器搜索的符号在什么位置。

    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:05
    版主
  • 11. 怎样解决“the breakpoint was not hit”问题?

    1. 确保最新的SPs和系统补丁被下载并正确安装。

    2. 正确的配置好下面的项目

    ASP.NET项目中,ASP.NET调试器被选中。

    SQL Server项目中,在数据连接上允许SQL/CLR调试。

    Sliverlight项目中,Silverlight调试器被选中。

    3. 确保Visual Studio在调试模式由于在调试模式下的代码不能有效操作。

    4. 打开进程窗口(调试->windows->进程),确保当前的调试类型是相应的类型。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:06
    版主
  • 1. 为什么SuppressMessageAttribute不好用?

    请检查在项目属性页中是否已经定义CODE_ANALYSIS常量,因为它是一个条件属性。在Visual Studio2008中,右键单击解决方案下的项目名能找到属性页。在它打开后,请选择生成标签,然后在条件编译符号框中输入CODE_ANALYSIS

    这个属性另一个模糊点是它的Scope,例如,module_level SuppressMessage。这个Scope属性描述了它所在的位置,不是他影响的范围。

    关于SuppressMessage属性更多的参考:

    使用SuppressMessage属性抑制警告:

    http://msdn.microsoft.com/en-us/library/ms182068(VS.80).aspx

    MSDN资料:模块级 SuppressMessageCA1051):

    http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/dd517e2e-a41d-4ffb-87ce-e2fd508231df

    为什么FxCop忽略in-code SuppressMessageAttribute 抑制?

    http://blogs.msdn.com/fxcop/archive/2006/03/23/559149.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:06
    版主
  • 2. 为什么FxCop1.36忽略了一些地方的托管代码?

    因为在FxCop中默认的命名和设计规则只在公共可见类型和成员上提高违反性。

      一个方案是在命令行运行FxCopcmd.exe,然后添加/overriderulevisibilities操作(简写:/orv

      另一个方案是在项目文件里添加<CodeAnalysisOverrideRuleVisibilities>

    下面是怎样做的例子(在一个类库项目中)

    1.卸载解决方案中的项目。

    2. Visual Studio编辑器中编辑项目文件。

    3. 在第一个<PropertyGroup>下加入下面代码:

    <PropertyGroup>

             ……

    <CodeAnalysisOverrideRuleVisibilities>
           true

    </CodeAnalysisOverrideRuleVisibilities>

      </PropertyGroup>

    相关资料:

    http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/bff07420-68e8-43bf-a7a3-8f245347d2f1
    http://blogs.msdn.com/fxcop/archive/2007/05/08/tip-how-to-change-the-orcas-managed-code-analysis-naming-design-rules-to-fire-on-internals.aspx


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:06
    版主
  • 3. 当在仪表模式下分析ASP.NET应用程序时出现“File contains no data”?

    通常的原因是在你运行程序时二进制文件没有被分析器调用。在一个Web应用程序中,你必须手动添加类库和其他的二进制文件来执行会话。

    相关资料:

    http://social.msdn.microsoft.com/Forums/en-US/vstsprofiler/thread/03224208-033a-423d-93c1-648040a1fa57


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:07
    版主
  • 4. 怎样阻止FxCop1.36对生成代码提高警告性?

    这个问题的产生是由于Code Analysis Team改变了FxCop分析代码的方式。阻止它请根据以下步骤:

    1. FxCop1.36中打开FxCop项目。

    2. 选择“项目”->“选项”->“检查分析”。

    3. 检查Suppress对代码分析的结果。

    4. 单击OK按钮。

    如果我们在命令提示符中运行代码分析,请在fxcopcmd.exe下添加/ignoregeneratedcode操作。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:07
    版主
  • 5. Visual Studio Profiler 支持64位操作系统么?

    Visual Studio2008 TeamDevelopment版集成了Profiler,支持64位操作系统。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:07
    版主
  • 1. 从输出窗口的错误列表中我怎样分析错误?

    你可以用OutputWindowPane.OutputTaskItemString()方法,这个方法不仅能写到输出窗口容器中而且对于错误列表也一样。

    代码样本:

       OutputWindowPane buildPane=_applicationObject.ToolWindows.OutputWindow.OutputWindowPanes.Item("Build");

    buildPane.Activate();

    buildPane.OutputTaskItemString("stdafx.h(1) : a", vsTaskPriority.vsTaskPriorityHigh, null, vsTaskIcon.vsTaskIconComment, "stdafx.h", 1, "a", true);

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/61c6bebb-0810-47f1-a3c6-f63307e12e92


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:08
    版主
  • 2. Visual Studio中我们如何订阅command事件?

    通过自动化集成开发环境,你可以使用集成开发环境下的Events事件来获得特殊的command事件作为它的向导和commandID号,然后建立一个CommandEvents.BeforeExecute的处理

         对于特殊的命令该如何获得命令集和命令的ID号,请参考以下文章:

            Using EnableVSIPLogging to identify menus and commands with VS 2005 + SP1

    相关帖子:

             http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/80d86c9c-5f4a-43e6-a83e-905fe08fd016

              http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/5d1926af-50b5-4120-93c0-11a8f988e235


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:08
    版主
  • 3. 在一个VC++项目中我如何获得附加包含目录的信息?

    通过自动化集成开发环境,通过VCConfigurationVCCLCompilerTool接口你能获得这样的信息.

       代码样本:

    foreach (Projectproj in _applicationObject.Solution.Projects)

    {

        VCProject vcp = proj.Object asVCProject;

        IVCCollection ivcc = vcp.Configurations asIVCCollection;

        VCConfiguration cfg = ivcc.Item(1) asVCConfiguration;

        IVCCollection tools = cfg.Tools asIVCCollection;

        VCCLCompilerTool compiler = tools.Item("VCCLCompilerTool") asVCCLCompilerTool;

        string addDir = compiler.AdditionalIncludeDirectories;

        MessageBox.Show(addDir);

    }

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/e773bd69-1387-4b08-88fe-94266cdeb842

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/833a6ed0-529c-472a-ba41-aa0be04a4212

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/44f9e2f8-568f-489a-8874-39c49170e1e5


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:09
    版主
  • 4. 在配置管理器中我如何指定配置?

    Visual Studio中有两种类型的配置,他们是:

        解决方案配置和项目配置。

    对于解决方案配置,在自动化集成开发环境中你可以使用SolutionConfigurations

    接口与其进行交互。

     

    对于项目配置,在自动化集成开发环境中你可以使用ConfigurationManager

    接口与其进行交互。

    下面的代码演示了在配置管理器中怎样重命名配置,因为name属性是只读的,你不能直接更改他们,所以你应该增加一个配置(静态调试),这个配置基于一个已经存在的调试。然后卸载调试配置。

    代码样本:

    try

    {

          // Modify the solution configuration name

          Solution2 sol = _applicationObject.Solution asSolution2;

         SolutionConfigurations sc = sol.SolutionBuild.SolutionConfigurations;

    if (sc.Item("Debug") != null)

       {

           sc.Add("DebugStatic", "Debug", true);

            sc.Item("Debug").Delete();

       }

       // Modify the project configuration name

          ConfigurationManager cm = sol.Projects.Item(1).ConfigurationManager;

          if (cm.ConfigurationRow("Debug") != null)

            {

               cm.AddConfigurationRow("DebugStatic", "Debug", true);

               cm.DeleteConfigurationRow("Debug");

             }

    }

    catch (Exception e)

    {

        System.Windows.Forms.MessageBox.Show(e.Message);

    }

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/5de5439a-5bd1-4a9f-aba4-b4a0e91e518e

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/a24637fc-b68c-4e5f-8abb-08ea1efce67


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:09
    版主
  • 5. 只在调试模式下我如何显示Add-In的菜单命令?

    要做到这一点,你可以指定QueryStatus()方法的状态参数作为vsCommandStatus的枚举符。你也可以检查当前的模式及集成开发环境下的模式的属性。

    代码样本:

    publicvoid QueryStatus(string commandName, vsCommandStatusTextWanted neededText, refvsCommandStatus status, refobject commandText)

    {

        if (neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)

       {

            if (commandName == "AddinSample.Connect.AddinSample"&&

    _applicationObject.Mode == vsIDEMode.vsIDEModeDebug)

           {

               status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported |

    vsCommandStatus.vsCommandStatusEnabled;

    return;

           }

       }

    }


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:09
    版主
  • 1. 怎样重复的使用存在的designer?

    在该帖子中就像Ed所指出的-在我们的应用程序中你可以通过DesignSurface重复的使用WinFormWorkFlow .designers.但是其它的designers WinForm WorkFlow designers有很大的不同。 Winform and WorkFlow designer组件实际上是包含在.NET Framework框架上。然而,在 WebForm and xaml designers是作为Visual Studio软件包的实现。并且依赖于Visual Studio IDE实现的许多服务,这些designers只能托管在Visual Studio IDE中。他们还分布/支持在isolated shell。他们不能被其他独立的应用程序利用。

    如果你想使用Isolated Shell,这是Christian博客中支持DSL designer的一个教程:

    DSL Tools and Visual Studio 2008 Isolated Shell (tutorial)

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/c4ade442-0241-4911-b407-0f70179be542

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/0ae1b40a-bdec-4fd4-b3db-94eab8566


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:10
    版主
  • 1. 我如何指定的Visual Studio的状态栏的文字?

    VSPackage中,你能通过SVsStatusbar服务指定状态栏。

    代码示例:

    IVsStatusbar statusBar = (IVsStatusbar)GetService(typeof(SVsStatusbar));

    int frozen;

    statusBar.IsFrozen(out frozen);

    if (frozen == 0)

    {

       // Set the status bar text and freeze its display.

        statusBar.SetText("Here is a text on status bar.");

        statusBar.FreezeOutput(1);

       // Get the status bar text.

       string text;

        statusBar.GetText(out text);

        System.Windows.Forms.MessageBox.Show(text);

       // Clear the status bar text.

        statusBar.FreezeOutput(0);

        statusBar.SetText("");

    }

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/fb150843-a9e1-484d-a284-3721154eff41


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:10
    版主
  • 2. 我如何获得当前选定的项目项?

    您可以使用SVsShellMonitorSelection服务来获取当前选择的IVsHierarchy,然后通过它的方法GetProjectItem获得的项目项,该论坛帖子下面的代码是Feng Chen答复的。

    代码示例:

    IntPtr hierarchyPtr, selectionContainerPtr;

    Object prjItemObject  =null;

    IVsMultiItemSelect mis;

    uint prjItemId;

    IVsMonitorSelection monitorSelection = (IVsMonitorSelection)Package.GetGlobalService(typeof(SVsShellMonitorSelection));

    monitorSelection.GetCurrentSelection(out hierarchyPtr, out prjItemId,out mis,out selectionContainerPtr);

    IVsHierarchy selectedHierarchy =Marshal.GetTypedObjectForIUnknown(hierarchyPtr,typeof(IVsHierarchy))asIVsHierarchy;

    if (selectedHierarchy !=null)

    {

    ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(prjItemId, (int)__VSHPROPID.VSHPROPID_ExtObject,out prjItemObject));

    }

    ProjectItem selectedPrjItem = prjItemObjectasProjectItem;

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/24f71d7f-bb7d-4df8-a00a-ff0ce6f4d48f


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:11
    版主
  • 3. 在VSPackage中如何获得DTE对象?

    Visual StudioDTE显示为一个全局服务。下面,你有办法在一个VSPackage得到DTE对象。

    代码示例:

    EnvDTE.DTE dte = (EnvDTE.DTE) GetService(typeof(EnvDTE.DTE));

    EnvDTE.IVsExtensibility extensibility =

    GetService(typeof(EnvDTE.IVsExtensibility))as

    EnvDTE.IVsExtensibility;

    EnvDTE.DTE dte = extensibility.GetGlobalsObject(null).DTEas EnvDTE.DTE;

    EnvDTE.DTE dte =System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0")as

    EnvDTE.DTE;

    请注意,如果这个环境没有全部的加载和初始化,GetServicetypeof运算(EnvDTE.DTE))可能会返回null,若要解决此问题,您只需要在你的Initialize方法中延缓执行此代码,直到VSPROPID_Zombie属性(有一个更好的属性在VS2010VSSPROPID_ShellInitialized)已被设置为false。要做到这一点,你的包应该实现IVsShellPropertyChanges接口,并从您的IVsShellPropertyChanges.OnShellPropertyChange执行初始化代码。欲了解更多详情,请查看下面文章:

    Dr. eX: Why does GetService(typeof(EnvDTE.DTE)) return null?

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/55f5d612-fea6-42a9-a3e2-c2625a7cd1b3


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:11
    版主
  • 4. 如何自动加载我VSPackage?

    属性ProvideAutoLoad是专为这一目的设计的,你可以根据不同的情况来加载我们的包。

    代码示例:

    [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]

    publicsealedclassVSPackage1Package : Package

    对于现有的各种UIContextGuids,您可以查找:

    UIContextGuids Members


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:12
    版主
  • 5. 在运行时我如何设置窗口工具的大小?

    由于Ed在该帖子中指出-基本理念是获得IVsWindowFrame接口并调用SetFramePos()方法。获取IVsWindowFrame接口可能有点棘手,你在IServiceProvider上查询SVsWindowFrame服务,通过你的工具窗口的IVsWindowPane.SetSite方法来实现。如果你使用的是MPF工具窗口,你可以使用ToolWindowPane下的Frame属性,但只有在OnToolWindowCreated方法被调用之后可以(确保工具窗口已经设置)。

    代码示例:

    Guid nullGuid = Guid.Empty;

    ToolWindowPane window = this.FindToolWindow(typeof(YourToolWindowClass), 0, true);

    if ((null == window) || (null == window.Frame))

    {

    thrownewNotSupportedException(Resources.CanNotCreateWindow);

    }

    IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;

    Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());

    windowFrame.SetFramePos(VSSETFRAMEPOS.SFP_fSize,ref nullGuid, 5, 5, 305, 305);

    请注意,Show方法被执行后调用SetFramePos方法

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/84dbae91-ee69-4081-b18a-5e3c37c1246f


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:12
    版主
  • 6. 我如何取代现有的语言服务?

    你需要提供属性[ProvideEditorExtension(typeof(...), ".js", 100)],指定优先级为100高于默认的,IDE将载入我们的语言服务,当它打开编辑器的时候。如果你想使用DTE.Open方法来打开你的语言服务加载文件请调用该方法,作为Constants.vsViewKindPrimary的第一个参数。

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/65a06008-58f3-4846-be84-4a1861f7f6a2

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/f2c6d5cc-f78c-418f-b02d-b821f54953d6

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/0d7ede50-16f9-43f4-b629-b869fdee3f8f

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/a3c34d61-472e-42c0-b36a-13fcaa13dd67

    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:13
    版主
  • 1. 通过Visual Studio项目模板创建一个项目应该如何设置Build Action?

    ProjectItem节点通过设置ReplaceParameterstrue可以代替项目项的属性。有点特殊,为了指定BuildAction,你应当使用ItemType属性。

    代码示例:

    <ProjectItemSubType=""

    TargetFileName="$fileinputname$.YYY"

    ReplaceParameters="true"

    ItemType="Embedded Resource"

    CustomTool="ARWrapperGenerator">

    MyFile.YYY

    </ProjectItem>

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/6bfe13fd-618e-477f-ab66-0f24c6b5d4c3

    http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/bd74f1bc-2c60-4f9c-b29f-e50bf16aadfc

    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:13
    版主
  • 2. 怎样诊断加载package失败?

    Dr. eX博客中已经详细的说明了这个问题:Debugging Package Load Failures


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:14
    版主
  • 1. 使用Devenv, MSBuild and VCBuild编译项目时有什么不同?

    Devenv使用MSBuild来编译项目,但MSBuild不能创建Visual C++项目,如果MSBuild遇到一个解决方案,包括Visual C++项目

    它将调用VCBuild,如果该项目使用的是C++,那么MSBuild将不被调用。而Devenv使用MSBuild编译解决方案文件,如果该项目是

    VB.NETC#,然后MSBuild将编译这个项目。

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/228193dc-402b-4953-ad75-d940bf9dbb1a


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:14
    版主
  • 2. 我如何使用MSBuild生成Vdproj文件(安装项目)?

    MSBuild的不能编译vdproj文件。如果你想在命令行编译vdproj文件,你可以使用DeVEnv,如果您只想使用MSBuild处理作为一种解决方法的vdproj文件

    你可以使用Exec任务调用devenv来构建解决方案。

    相关例子:

    <Exec command="DevEnv Mysol.sln /build -switch" />

    (-switch can be replaced by Debug|x86, etc.)

         (文献:http://techproblemssolved.blogspot.com/2009/05/msbuild-and-vdproj-files.html)

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/6c759a44-6ab8-4643-bfd5-4a2fc2a4bd7a

    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:15
    版主
  • 3. 在MSBuild文件中如何设置环境变量?

    没有直接的方法来设置默认的MSBuild文件的环境变量,但是你可以写一个任务来做到这一点。首先,你需要的是创造一个新的C#类库项目,并写一个这样的任务:

    代码示例:

    using Microsoft.Build.Framework;

    using Microsoft.Build.Utilities;

    namespace MSBuildtasks

    {

    public class SetEnvVar : Task

    {

    private string _variable;

    private string _value;

    [Required]

         public string Variable

        {          get { return _variable; }

            set { _variable = value; }

    }

         [Required]

           public string Value

           {

             get { return _value; }

            set { _value = value; }

           }

         public override bool Execute()

           {

               Environment.SetEnvironmentVariable(_variable, _value);

             return true;        }

       }

    }

      然后在项目文件中使用它:

    代码示例:

    <UsingTask TaskName="MSBuildTasks.SetEnvVar"

           AssemblyFile="$(RootDir)Tools\Bin\MSBuildTasks.dll"/>

    <PropertyGroup>

    <TestPath>$(VS90COMNTOOLS)..\..</TestPath>

    </PropertyGroup>

    <Target Name="PrepareBuildEnvironment">

    <!-- To dump the env run msbuild with /p:DumpEnv=y switch -->

    <SetEnvVar Variable="TestPath" Value="$(TestPath)"/>

    <Message Condition="'$(DumpEnv)' != ''" Text="DumpEnv Requested:" />

    <Exec Condition="'$(DumpEnv)' != ''" Command="set" />

    </Target>

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:16
    版主
  • 4. 我如何解析XML的项目文件?

    解析一个XML的项目文件,你可以使用Microsoft.Build.BuildEngine命名空间的类。下面是一个从项目文件中用c#语言读取AssembleName属性的例子:

    代码示例:

    usingMicrosoft.Build.BuildEngine;

    usingMicrosoft.Build.Framework;

    usingMicrosoft.Build.Utilities;

    Engine buildEngine =newEngine(AppDomain.CurrentDomain.BaseDirectory);

    Project project =newProject(buildEngine);

    project.Load("D:\\ABC.csproj");

    String assemblyName;

    assemblyName = project.GetEvaluatedProperty("AssemblyName");

    相关帖子:

    Parsing a Project file with XML


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:16
    版主
  • 5. 如何使用MSBuild确定依赖?

    有两种方法来表达项目到项目的依赖:

    1.      项目到项目的引用(Add Reference->Project tab[此机制也处理正在收集文件以及被引用的输出文件]。对于.csproj文件,这是始终作为一个<ProjectReference>项目在项目文件中.

    2.      明确指定的依赖关系(Solution properties->Project Dependencies[作为这个机制你通常会添加一个引用的参考文件]。这写在了.sln下的projectdependencies一节中。

    为了使figure生成正确的顺序MSBuild将在命令行使用这两者。如果不存在,它的创建顺序是不确定的。在vs里,如果不存在,创建顺序也是不确定的并且大部分都不同:它依赖于VS内和MSBuild内的实现细节而定。我不建议你依赖于随即顺序因为vsMSBuild给你的是缺乏的依赖信息。

           因此,在vs中可能有一个解决方案(可能只在一个特定版本的VS)但是在MSBuild中没有,由于缺少依赖信息。使用这两个机制,对于解决方案你可以指定正确的依赖关系。而你并不需要两者。

    相关帖子:

    Is there a way to get MSBuild to use .sln files but determine dependency order for builds?


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:16
    版主
  • 6. 在MSBuld中如何report一个错误?

    如果您在MSBuild中已经发现了错误(或者在Visual Studio其他任何的)最好的report方式是通过产品反馈中心:       https://connect.microsoft.com/feedback/Search.aspx?SiteID=210

    这个允许你跟踪这个问题的进展,如果我们打开自己内部的问题你就不能做了,此外,客户的report问题获得较高的优先级,所以它更可能是固定的。

    有时,错误是很难或者不可能为我们重现的,这使得我们很难解决这些问题。这里是一个好的bug report的一些建议:

    1)一个解决方案或者项目的复制问题,或者是从无到有的创建的步骤的问题,如果可能的话,请缩小代码和以最简单的形式再现了问题的解决。这也应该避免了你需要发送

    你公司的知识产权

    2)获得诊断记录。在Visual Studio外部,使用命令行MSBuild /v:diag,将诊断信息输出到一个文件并定位到错误信息;在Visual Studio里面,进入工具>选项项目和解决方案>生成和运行,和更改MSBuild的输出等级(Verbosity)到“Diagnostic“。然后重新编译您的项目,并从输出窗口中复制输出-与这个错误相关联的信息。

    请让我们知道你所期望的行为,任何其它有关环境有关的信息可能是有用的,比如你是否试过在多台计算机上,无论它总是发生或刚刚开始,是否发生在VS2003(如果适用话),以此类推。

    也可以通过相同的网页进行反馈-我们期待任何有价值的建议。


    Vicky Song [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月17日 4:17
    版主