如何編寫Vault外掛擴充套件Vault Explorer的功能

峻祁連發表於2013-10-28

今天練習了一下Vault Explorer的擴充套件程式,基本上是Vault SDK中的HelloWord示例程式。如果你剛剛開始接觸Vault的二次開發,希望對你有幫助。

開始之前,你需要安裝Vault SDK, 安裝Vault client或者Vault Server後,在安裝目錄下你都能找到Vault SDK的安裝程式,把這個SDK安裝一下,一般會安裝到C:\Program Files (x86)\Autodesk\Autodesk Vault 2014 SDK目錄下。這個SDK對於Vault開發非常重要,裡面包括Vault開發文件、示例程式和一些必要的程式集。

另外還有重要的部落格: http://justonesandzeros.typepad.com 

 

這個例子就是要擴充套件Vault Explorer的功能,在選中檔案時的右鍵選單中參加新增一個自定義命令,執行這個命令時檢視選中檔案的大小。好了,現在開始操練起來。 首先啟動Visual Studio建立一個Class library的專案。對於Vault 2014,.net framework選擇4.0。然後新增一些必要的引用,對於這個例子需要新增的引用如下,所有這些程式集都可以從Vault SDK中找到:

"Autodesk.Connectivity.WebServices.dll"

"Autodesk.Connectivity.Explorer.Extensibility.dll"

"Autodesk.Connectivity.Extensibility.Framework.dll"

Autodesk.DataManagement.Client.Framework.dll

Autodesk.DataManagement.Client.Framework..Vault.dll

image

對於這些引用,要把Copy Local改成false,因為Vault Explorer都已經包含這些程式集了。

 

下面來寫點程式碼,對於Vault Explorer擴充套件程式,必須給程式集的AssemblyInfo中新增以下5個程式集屬性,否則的話你的擴充套件程式將不能進行:

//必須包含下面5個程式集屬性,否則不能執行
//[assembly: AssemblyCompany("Autodesk")]
//[assembly:AssemblyProduct("HelloWorldVaultExplorerExtension")]
//[assembly:AssemblyDescription("This is a sample application to extend vault explorer")]

//這裡的GUID可以用Visual Studio的工具生成, 工具-->生成GUID
[assembly: Autodesk.Connectivity.Extensibility.Framework.ExtensionId("9FB25A13-242C-4BAE-93B5-B08D77B619CA")]
//對應Vault的版本號,對應Vault 2014,版本號為6.0
[assembly: Autodesk.Connectivity.Extensibility.Framework.ApiVersion("6.0")]

 

一般前面三個是通用的,VS都已經加好了你只要保證他們的值正確就行了,檢視的方法就是,進入專案的屬性,程式選項卡,上面有個程式集資訊按鈕:

image

 

為了讓Vault Explorer認識這是Vault explorer的外掛,我們還需要定義一個.vcet.config檔案,這個就是一個xml,內容如下,你可以從Vault SDK中的幫助檔案中找到模版,把內容改一下就行了。注意其中加粗的部分,格式的 “程式集名.類名, 程式集名”:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <connectivity.ExtensionSettings3>
    <extension
      interface="Autodesk.Connectivity.Explorer.Extensibility.IExplorerExtension, Autodesk.Connectivity.Explorer.Extensibility, Version=18.0.0.0, Culture=neutral, PublicKeyToken=aa20f34aedd220e1"
      type="HelloWorldVaultExplorer.HelloWorld, HelloWorldVaultExplorer">
    </extension>
  </connectivity.ExtensionSettings3>
</configuration>
 

在Build時要把這個檔案拷貝到輸出目錄:

image

 

然後新增一個public的類,並且實現IExplorerExtension介面, 下面是全部程式碼,包括註釋:

using Autodesk.Connectivity.Explorer.Extensibility;
using Autodesk.Connectivity.WebServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using VDF = Autodesk.DataManagement.Client.Framework;

//必須包含下面5個程式集屬性,否則不能執行
//[assembly: AssemblyCompany("Autodesk")]
//[assembly:AssemblyProduct("HelloWorldVaultExplorerExtension")]
//[assembly:AssemblyDescription("This is a sample application to extend vault explorer")]

//這裡的GUID可以用Visual Studio的工具生成, 工具-->生成GUID
[assembly: Autodesk.Connectivity.Extensibility.Framework.ExtensionId("9FB25A13-242C-4BAE-93B5-B08D77B619CA")]
//對應Vault的版本號,對應Vault 2014,版本號為6.0
[assembly: Autodesk.Connectivity.Extensibility.Framework.ApiVersion("6.0")]

namespace HelloWorldVaultExplorer
{
    public class HelloWorld :IExplorerExtension
    {
        public IEnumerable<CommandSite> CommandSites()
        {
            //建立一個HelloWorld Command物件
            CommandItem helloWorldCmdItem = new CommandItem("HelloWorldCommandItem", "Hello World - Daniel");
            helloWorldCmdItem.NavigationTypes = new SelectionTypeId[] { SelectionTypeId.File, SelectionTypeId.FileVersion };
            helloWorldCmdItem.MultiSelectEnabled = false;
            helloWorldCmdItem.Hint = "這是一個對File和FileVersion的helloworld命令";
            helloWorldCmdItem.ToolbarPaintStyle = PaintStyle.TextAndGlyph;

            //繫結Execute事件
            helloWorldCmdItem.Execute += helloWorldCmdItem_Execute;

            //建立一個CommandSite
            CommandSite toolBarCmdSite = new CommandSite("HelloWorldCommand.Toolbar","Hello World Menu - Daniel");
            toolBarCmdSite.Location = CommandSiteLocation.AdvancedToolbar;
            toolBarCmdSite.DeployAsPulldownMenu = false;
            toolBarCmdSite.AddCommand(helloWorldCmdItem);


            //建立另一個Command site繫結到File的右鍵選單
            CommandSite fileContextCmdSite = new CommandSite("HelloWorldCommand.FileContextMenu", "Hello World Menu - Daniel")
            {
                Location = CommandSiteLocation.FileContextMenu,
                DeployAsPulldownMenu = false
            };
            fileContextCmdSite.AddCommand(helloWorldCmdItem);

            //把剛才建立的兩個command site放在一個list裡
            List<CommandSite> sites = new List<CommandSite>();
            sites.Add(toolBarCmdSite);
            sites.Add(fileContextCmdSite);

            //返回CommandSite列表
            return sites;


            

        }

        void helloWorldCmdItem_Execute(object sender, CommandItemEventArgs e)
        {
            try
            {
                //using VDF = Autodesk.DataManagement.Client.Framework
                VDF.Vault.Currency.Connections.Connection connection = e.Context.Application.Connection;

                if (e.Context.CurrentSelectionSet.Count() == 0)
                {
                    System.Windows.Forms.MessageBox.Show("Nothing is selected");
                }
                else if (e.Context.CurrentSelectionSet.Count() > 1)
                {
                    MessageBox.Show("Thhis function does not support multiple selections");
                }
                else
                {
                    //找到選中的物件
                    ISelection selection = e.Context.CurrentSelectionSet.First();

                    File selectedFile = null;
                    if (selection.TypeId == SelectionTypeId.File)
                    {
                        // our ISelection.Id is really a File.MasterId
                        selectedFile = connection.WebServiceManager.DocumentService.GetLatestFileByMasterId(selection.Id);

                    }
                    else if (selection.TypeId == SelectionTypeId.FileVersion)
                    {
                        // our ISelection.Id is really a File.Id
                        selectedFile = connection.WebServiceManager.DocumentService.GetFileById(selection.Id);
                    }

                    if (selectedFile == null)
                    {
                        MessageBox.Show("Selection is not a file.");
                    }
                    else
                    {
                        // 演示,看看檔案的大小
                        MessageBox.Show(String.Format("Hello World! The file size is: {0} bytes",
                                             selectedFile.FileSize));
                    }


                }
            }
            catch (Exception ex)
            {
                // If something goes wrong, we don't want the exception to bubble up to Vault Explorer.
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        public IEnumerable<CustomEntityHandler> CustomEntityHandlers()
        {
        }

        public IEnumerable<DetailPaneTab> DetailTabs()
        {
        }

        public IEnumerable<string> HiddenCommands()
        {
        }

        public void OnLogOff(IApplication application)
        {
        }

        public void OnLogOn(IApplication application)
        {
        }

        public void OnShutdown(IApplication application)
        {
        }

        public void OnStartup(IApplication application)
        {
        }
    }
}


現在編譯一下,發現會提示如下錯誤資訊:

Error    1    The type 'Microsoft.Web.Services3.WebServicesClientProtocol' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.    c:\users\duda\documents\visual studio 11\Projects\HelloWorldVaultExplorer\HelloWorldVaultExplorer\HelloWorld.cs    89    25    HelloWorldVaultExplorer

 

按照提示,我們需要新增到'Microsoft.Web.Services3的引用,這需要下載安裝Microsoft Web Service Extensions(WSE)3.0 ,放狗搜一下就好了,很好找。另外還需要新增引用System.web.services. 你可以看一下這個部落格http://justonesandzeros.typepad.com/blog/2010/03/file-transfer-as-binary-data.html .現在應該編譯成功了.

 

然後就是部署和除錯了:

部署Vault Explorer擴充套件程式,要把你的程式集部署到%ProgramData%/Autodesk/Vault 2014/Extensions/目錄中,直接在檔案瀏覽器中敲上面的路徑就行了,如果%ProgramData%/沒有定義,在Windows XP 和 Windows 20013中一般是 C:\Documents and Settings\All Users\Application Data,在Vista和win 7/8中一般是C:\ProgramData。然後你需要在%ProgramData%/Autodesk/Vault 2014/Extensions/目錄中建立一個資料夾,雖然可以是任意的名字,但最後和你的程式名稱一致,比如我的程式這裡叫HelloWorldVaultExplorer,那我就建立一個資料夾:C:\ProgramData\Autodesk\Vault 2014\Extensions\HelloWorldVaultExplorer,然後把所有的輸出檔案拷貝到這裡來。

 

好了,現在可以啟動Vault Explorer來檢驗一下我們的成果了,選中一個檔案點右鍵,我的自定義命令已經新增了,執行時就顯示該檔案的大小。成果,慶祝!

image

 

 

最後再說說除錯,一般開發程式都需要大量除錯,對於Vault外掛的除錯也很簡單,前文書已經說了自定義外掛的位置,也建立了相關目錄,我們可以把程式的輸出目錄指向那裡,然後在VS專案屬性的debug選項卡中選擇啟動外部程式,指向Vault Explorer的啟動程式 C:\Program Files\Autodesk\Vault Professional 2014\Explorer\Connectivity.VaultPro.exe,另外把工作目錄也指向C:\Program Files\Autodesk\Vault Professional 2014\Explorer\,然後在程式碼中設定埠,按F5啟動,應該就能看到斷點了:

 

image

如果你遇到什麼問題造成除錯斷點不起作用,請看一下這個部落格,尤其是評論中列舉出的幾種常見錯誤:

http://justonesandzeros.typepad.com/blog/2010/04/debugging-a-custom-command.html

相關文章