次の方法で共有


PWA 互換性を確認するマネージ コード アドインを作成する

適用対象: Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010

この記事の内容
アドインを作成する
アドインをデバッグする
アドインを展開する

ここでは、Microsoft Visual Studio 2010 の Microsoft Office 開発ツール を使用して、Microsoft Project Professional 2010 のマネージ コード アドインを開発および展開する方法について説明します。このアドインでは、プロジェクトを Project Web App で編集できなくなる条件の有無をチェックします (この記事は、Microsoft Corporation の Mike Shughrue が作成した内容とサンプル コードを出典としています)。

Visual Studio 2010 には、Microsoft Office アドイン用のプロジェクト テンプレートが含まれており、これを使用すると、マネージ コード アドインを簡単に作成、デバッグ、および展開できます。アドインは、Project の機能を拡張したり自動化したりするのに便利です。アドインの作成には Microsoft Visual C#、Microsoft Visual Basic、その他のマネージ言語を使用できるので、Microsoft .NET Framework を使用するプログラマは既に使い慣れた構文を使用でき, .NET Framework にフル アクセスできます。アドインのデバッグは、Visual Studio 統合開発環境 (IDE) で他の種類のアプリケーションのデバッグと同じように実行できます。COM アドインの展開は以前は複雑でしたが、Visual Studio 2010 では ClickOnce の使用によって容易になりました。

このアドインでは、Project クライアント オブジェクト モデルを使用して、プロジェクト データにアクセスし、そのプロジェクトを Project Web App で編集できるかどうか調べる各種チェックを実行します。プロジェクトが基準を満たさない場合、このアドインは、そのプロジェクトが Project Web App で読み取り専用になる条件のリストをダイアログ ボックスに表示します。このアドインは、ProjectBeforeSave2 イベント ハンドラーによって自動的に実行され、また、カスタム リボン ボタンを使用して対話的に実行することもできます。

シナリオ:   Project Server 2010 では、Project Web App の [プロジェクト センター] ページでプロジェクトを編集できます。サーバー側のスケジュール エンジンの制約によって、以下の条件下ではプロジェクトが Project Web App で読み取り専用になります。

  • プロジェクトがマスター プロジェクトである。

  • プロジェクトに 1 つ以上の null タスクが含まれている。null タスクとは、他の 2 つのタスクの間にある空白のタスク行です。

  • 作業時間固定のタスクがある。既定では、自動的にスケジュールされたタスクは単位数固定になります。タスクを期間固定に設定することもできます。

  • タスク カレンダーのあるタスクがある。Project クライアントでは、プロジェクト カレンダーとリソース カレンダーのほかに、タスク カレンダーも指定できます。既定では、タスク カレンダーは "なし" です。

これらの条件は Project Professional 2010 では問題ありませんが、プロジェクト マネージャーは、プロジェクトを保存する前に、そのプロジェクトが Project Web App で編集できなくなる可能性について通知を受けることができると便利です。これを行う最良の方法は、プロジェクトのこのような条件をチェックするアドインを実装することです。

この記事は次のセクションで構成されます。

  • アドインを作成する

    • 検証エラーを格納する

    • インターフェイスを指定する

    • エラーをチェックする

    • エラーを表示する

    • アドインをリボンから実行する

    • アドインをイベント ハンドラーで実行する

  • アドインをデバッグする

  • アドインを展開する

    • まとめ

注意

Project2010EditableAddin アドインは、Microsoft Project Standard 2010 と Project Professional 2010 の両方の Project クライアントに共通のクラスとメンバーを使用するので、どちらのクライアント用にも開発およびインストールできます。ただし、Project Server へ保存できるのは Project Professional 2010 だけです。

アドインを作成する

この記事では、Visual Studio 2010 ソリューション名、プロジェクト名、名前空間名、およびアドイン アセンブリ名は、すべて Project2010EditableAddIn です。手順 1. では、メイン アドイン プロジェクトの作成方法を説明します。手順 2. では、このアドインの検証ルール用ストレージ クラスが含まれる第 2 のプロジェクトの作成方法を説明します。手順 3. では、検証ルール クラスのインターフェイス定義を追加します。

手順 1. アドインを作成するには

  1. 管理者として Visual Studio 2010 を実行し、Project 2010 アドイン プロジェクトを作成します。この例では、作成するプロジェクトに Project2010EditableAddIn という名前を付けます (図 1)。

  2. [新しいプロジェクト] ダイアログ ボックスの上部にあるドロップダウン メニューで、[.NET Framework 3.5] を選択します。[ソリューションのディレクトリを作成] チェック ボックスをオフにし、[OK] をクリックします。

    注意

    .NET Framework 3.5 を使用する場合と .NET Framework 4.0 を使用する場合の相違点については、「Designing and Creating Office Solutions」を参照してください。

    図 1. Project 2010 アドインの作成

    Project 2010 アドインの作成

  3. ThisAddIn.cs ファイルで、ThisAddIn_Startup メソッド内に「this.Application.ProjectBeforeSave2 +=」という行を入力します。

    「+=」という文字を入力した後で Tab キーを押すと、IntelliSense によってステートメントの続きが自動的に追加され、Application_ProjectBeforeSave2 というメソッド名が指定されます。もう一度 Tab キーを押すと、Visual Studio によって Application_ProjectBeforeSave2 イベント ハンドラー メソッドが追加され、そこに NotImplementedException ステートメントが追加されます。以下に例を示します。

    using System;
    using System.Data;
    using MSProject = Microsoft.Office.Interop.MSProject;
    using Office = Microsoft.Office.Core;
    
    namespace Project2010EditableAddIn
    {
        public partial class ThisAddIn
        {
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
                this.Application.ProjectBeforeSave2 +=
                    new MSProject._EProjectApp2_ProjectBeforeSave2EventHandler(
                        Application_ProjectBeforeSave2);
            }
    
            void Application_ProjectBeforeSave2(MSProject.Project pj, bool SaveAsUi, 
                MSProject.EventInfo Info)
            {
                throw new NotImplementedException();
            }
    
            private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
            {
            }
    
            // Code generated by VSTO.
            //    . . .
        }
    }
    

検証エラーを格納する

IValidationRules プロジェクトでは、このアドインの ValidationRules クラスのインターフェイスを定義し、検証エラーの格納と列挙に使用する ValidationError クラスと ValidationErrors コレクション クラスを含めます。

手順 2. 検証エラーを格納するクラスを作成するには

  1. ソリューション エクスプローラーで、Project2010EditableAddIn ソリューション (プロジェクトではありません) を右クリックし、IValidationRules という名前の新しいプロジェクトを追加します。

  2. オプション: 名前空間の名前を変更します。たとえば、IValidationRules プロジェクトの名前空間の名前を Microsoft.SDK.Project.Samples.ValidationRules に変更します。

  3. オプション: クラス ファイルの名前を変更します。たとえば、IRules.cs というファイル名にします。

  4. ValidationError クラスを追加します。このクラスには、エラー メッセージの 1 つのインスタンスおよび関連するタスク ID データを格納できるようにします。クラス コンストラクターで、各インスタンスの Msg プロパティと TaskID プロパティを設定します。

    using System;
    using System.Data;
    using System.Collections;
    using System.Collections.Generic;
    using MSProject = Microsoft.Office.Interop.MSProject;
    
    namespace Microsoft.SDK.Project.Samples.ValidationRules
    {
        // Store one instance of a validation error.
        public class ValidationError
        {
            public ValidationError(string msg, int taskId)
            {
                this.Msg = msg;
                this.TaskID = taskId;
            }
    
            // Message property.
            public string Msg
            { get; set; }
    
            // Task ID property.
            public int TaskID
            { get; set; }
        }
        // . . .
    }
    
  5. ValidationErrors という名前のクラスを追加します。このクラスに ValidationError オブジェクトのコレクションを格納し、各オブジェクトを列挙できるようにします。クラス コンストラクターで、errors クラス変数を開始します。この変数は、ValidationError 型のジェネリック List オブジェクトです。

    // Store a collection of validation errors.
    public class ValidationErrors : IEnumerable<ValidationError>
    {
        List<ValidationError> errors;
    
        public ValidationErrors()
        {
            errors = new List<ValidationError>();
        }
    
        public void Add(ValidationError error)
        {
            errors.Add(error);
        }
    
        public IEnumerator<ValidationError> GetEnumerator()
        {
            foreach (ValidationError err in errors)
            {
                yield return err;
            }
        }
    
        // Explicit interface implementation.
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

インターフェイスを指定する

IRules インターフェイスを使用するクラスには、project パラメーターを受け取る IsValid メソッド、ValidationErrors 型の ErrorList プロパティ、および DataTable 型の ErrorTable プロパティを実装する必要があります。

手順 3. ValidationRules クラスのインターフェイスを指定するには

  1. IRules.cs ファイルに、以下の using ステートメントを追加します。

    using System.Collections;
    using MSProject = Microsoft.Office.Interop.MSProject;
    
  2. IRules という名前のインターフェイスを追加します。

  3. IsValid メソッドの定義、読み取り専用の ErrorList プロパティ、および読み取り専用の ErrorTable プロパティを追加します。IRules インターフェイスのコード全体は以下のようになります。

    // Specify the interface for the ValidationRules class.
    public interface IRules
    {
        bool IsValid(MSProject.Project project);
    
        ValidationErrors ErrorList { get; }
        DataTable ErrorTable { get; }
    }
    

IRules インターフェイスから継承できるようにするために、IValidationRules プロジェクトをコンパイルして IValidationRules.dll アセンブリを作成します。

エラーをチェックする

Project2010EditableAddIn プロジェクトに ValidationRules クラスを作成します。ValidationRules クラスでは、IRules インターフェイスのメソッドとプロパティを実装します。IsValid メソッドはエラーをチェックし、ErrorList プロパティはエラー データを格納します。ErrorTable プロパティは、DataGridView コントロールにエラーを表示しやすいようにデータを格納します。

手順 4. エラーをチェックするクラスを作成するには

  1. Project2010EditableAddIn プロジェクトを右クリックし、ValidationRules という名前のクラスを追加します。

  2. IValidationRules プロジェクトの IValidationRules\bin\Debug サブディレクトリにある IValidationRules.dll アセンブリへの参照を設定します。

  3. ValidationRules 名前空間と MSProject 名前空間に対する using ステートメントを追加します。

  4. IRules を継承する内部クラスとして ValidationRules を設定します。

  5. MSProject.Application 型のクラス変数 application、ValidationErrors 型の変数 errors、およびエラーの数を格納する NumErrors プロパティを作成します。これらのクラス変数と NumErrors プロパティをクラス コンストラクター内で初期化します。

    using System;
    using System.Data;
    using MSProject = Microsoft.Office.Interop.MSProject;
    using Microsoft.SDK.Project.Samples.ValidationRules;
    
    namespace Project2010EditableAddIn
    {
        // The ValidationRules class must implement each member specified in the IRules interface.
        internal class ValidationRules : IRules
        {
            private MSProject.Application application;
            private ValidationErrors errors;
    
            internal ValidationRules(MSProject.Application app)
            {
                application = app;
                errors = new ValidationErrors();
                this.NumErrors = 0;
            }
    
            // Keep count of the number of errors.
            public int NumErrors
            { get; set; }
    
        }
    }
    
  6. IsValid メソッドでエラー メッセージに使用するリソース文字列を作成します。

    1. ソリューション エクスプローラーで、Project2010EditableAddIn プロジェクトの [Properties] フォルダーを展開し、Resource.resx をダブルクリックします。表 1 のように、4 つのリソース プロパティと値を作成します。

      表 1. リソース プロパティと値

      名前

      MASTER_PROJECT

      This project is a master project.

      NULL_TASK

      This task is null.

      FIXED_WORK_TASK

      This task has fixed work.

      TASK_CALENDAR

      This task has a task calendar

    2. Resources.resx を保存して閉じます (TASK_CALENDAR の値の文末にピリオドは付けません)。

  7. 以下の条件をチェックする IsValid メソッドを実装します。

    • サブプロジェクトが含まれているプロジェクトはマスター プロジェクトです。マスター プロジェクトは Project Web App で編集できません。

    • null タスクがないかチェックします。

    • 作業時間固定のタスクがないかチェックします。

    • タスク カレンダーを使用するタスクがないかチェックします。

    エラーを検出するたびに、NumErrors プロパティをインクリメントします。

    // Check the project and all tasks for values that are not valid for editing in Project Web App. 
    // If any value is an error, the project cannot be edited.
    public bool IsValid(MSProject.Project project)
    {
        bool isValid = true;
    
        // If the project is a master project, the project is not valid.
        if (project.Subprojects.Count > 0)
        {
            isValid = false;
            this.NumErrors++;
    
            int taskId = 0;
            string validationErr = project.Name + ": " + Properties.Resources.FIXED_WORK_TASK;
            ErrorList.Add(new ValidationError(validationErr, taskId));
        }
    
        int index = 0;
        foreach (MSProject.Task task in project.Tasks)
        {
            index++;
    
            // If the task is null, the project is not valid.
            if (task == null)
            {
                isValid = false;
                this.NumErrors++;
                ErrorList.Add(new ValidationError(Properties.Resources.NULL_TASK, index));
    
                // Do not check any properties for the null task; 
                // otherwise, you get a null reference exception.
                continue; 
            }
    
            // If the task has fixed work, the project is not valid.
            if (task.Type == MSProject.PjTaskFixedType.pjFixedWork)
            {
                isValid = false;
                this.NumErrors++;
    
                string validationErr = task.Name + ": " + Properties.Resources.FIXED_WORK_TASK;
                ErrorList.Add(new ValidationError(validationErr, index));
            }
    
            // If the task has a task calendar, the project is not valid.
            if (!(task.Calendar == "None"))
            {
                isValid = false;
                this.NumErrors++;
    
                string validationErr = task.Name + ": " + Properties.Resources.TASK_CALENDAR;
                validationErr += ": " + task.Calendar;
                ErrorList.Add(new ValidationError(validationErr, index));
            }
        }
        return isValid;
    }
    
  8. 読み取り専用の ErrorList プロパティを実装します。このプロパティは ValidationErrors 型の errors オブジェクトを取得します。

    // Retrieve the ErrorList, to add errors or read the collection of errors.
    public ValidationErrors ErrorList
    {
        get { return errors; }
    }
    
  9. 読み取り専用の ErrorTable プロパティを実装します。このプロパティは、ErrorList オブジェクト内の各 ValidationError アイテムを DataTable オブジェクトにコピーします。

    // Build and return a DataSet with the validation errors.
    public DataTable ErrorTable
    {
        get
        {
            DataTable dtErrors = new DataTable("Errors");
            dtErrors.Columns.Add("TaskId", Type.GetType("System.String"));
            dtErrors.Columns.Add("Message", Type.GetType("System.String"));
    
            foreach (ValidationError error in ErrorList)
            {
                DataRow row = dtErrors.NewRow();
                row["TaskId"] = error.TaskID.ToString();
                row["Message"] = error.Msg;
                dtErrors.Rows.Add(row);
            }
            return dtErrors;
        }
    }
    

エラーを表示する

Project2010EditableAddIn を実行してエラーが検出された場合には、ErrorTable オブジェクトに格納されているエラーのリストをダイアログ ボックスに表示します。

手順 5. エラーを表示するダイアログ ボックスを作成するには

  1. ソリューション エクスプローラーで、Project2010EditableAddIn プロジェクトを右クリックし、[追加] をクリックし、次に [Windows フォーム] をクリックします。

  2. 追加したクラスに ErrorDialog という名前を付けます。

  3. [プロパティ] ウィンドウで、ErrorDialog クラスの Text プロパティを「Validation Errors」に設定します。

  4. ControlBox プロパティを False に設定します。

  5. ErrorDialog フォームにボタンを追加し、そのボタンの名前を btnCancel に設定します。Anchor プロパティを Bottom、Right に、DialogResult プロパティを Cancel に、Text プロパティを「Cancel: Do Not Save」に設定します。

  6. ErrorDialog フォームにボタンを追加し、そのボタンの名前を btnOK に設定します。Anchor プロパティを Bottom、Right に、DialogResult プロパティを OK に、Text プロパティを「OK: Save Anyway」に設定します。

  7. ErrorDialog.cs のデザイン ビューで、[Validation Errors] フォームをクリックします。AcceptButton プロパティを btnOK に設定します。CancelButton プロパティを btnCancel に設定します。

  8. このダイアログ ボックスに dgErrors という名前の DataGridView コントロールを追加します。

  9. DataGridView コントロールの上にラベルを追加します。このラベルに lblErrMess のような名前を付けます。Text プロパティに一時的な値を設定します。たとえば、「Errors in the project」と入力します。この Text プロパティは、ErrorDialog クラスの SetErrorCount メソッドによって変更されます。このラベルの幅を大きくして、DataGridView コントロールと同じ幅になるようにします (図 2)。ラベルの高さも大きくして、4 行のテキストを表示できる高さにします。

    図 2. [Validation Errors] ダイアログ ボックスの Label コントロールのサイズ拡大

    ダイアログ ボックス内のラベルのサイズの設定

  10. ErrorDialog.cs ファイルに以下のコードを追加します。

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace Project2010EditableAddIn
    {
        internal partial class ErrorDialog : Form
        {
            private int dlgWidth;
            private int dlgHeight;
    
            internal ErrorDialog()
            {
                InitializeComponent();
            }
    
            internal void SetErrors(DataTable dtErrors)
            {
                dgErrors.DataSource = dtErrors;
    
                // Set values for the grid user interface.
                dgErrors.Columns["TaskId"].HeaderText = "Task Number";
                dgErrors.Columns["TaskId"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                dgErrors.Columns["Message"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }
    
            // Change the label text to show the number of errors.
            internal void SetErrorCount(int numErrors)
            {
                lblErrMess.Text = "Number of errors: " + numErrors.ToString();
                lblErrMess.Text +=
                    "\n\nThe following errors in the project can prevent it from being editable";
                lblErrMess.Text += "\nin Project Web App.";
            }
    
            // Get the size of the dialog box before resizing.
            private void ErrorDialog_ResizeBegin(object sender, EventArgs e)
            {
                dlgWidth = this.Width;
                dlgHeight = this.Height;
            }
    
            // Calculate the new size of the DataGrid.
            private void ErrorDialog_ResizeEnd(object sender, EventArgs e)
            {
                dgErrors.Width += this.Width - dlgWidth;
                dgErrors.Height += this.Height - dlgHeight;
            }
        }
    }
    
  11. ErrorDialog フォームのデザイン ビューでフォームをクリックし、[プロパティ] ウィンドウで [イベント] アイコンをクリックします。ResizeBegin イベントのドロップダウン リストで [ErrorDialog_ResizeBegin] を選択します。ResizeEnd イベントのドロップダウン リストで [ErrorDialog_ResizeEnd] を選択します。

これで、ErrorDialog フォームを、ThisAddIn.cs 内の Application_ProjectBeforeSave2 イベント ハンドラーからインスタンス化および初期化して呼び出す準備ができました。

アドインをリボンから実行する

ユーザーが検証チェックをオンデマンドで実行できるようにするリボン タブとボタンを作成します。

手順 6. アドインを実行するリボン タブとボタンを追加するには

  1. ソリューション エクスプローラーで、Project2010EditableAddIn プロジェクトを右クリックし、新しい項目を追加します。[新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナー)] をクリックします。このクラスに ValidationRibbon という名前を付けます。

  2. ツールボックスの [Office リボン コントロール] タブを展開し、Button コントロールを [ValidationRibbon.cs [デザイン]] タブの [group1] へドラッグします。

  3. group1 コントロールをクリックし、Label プロパティをクリアして、グループ ラベルが表示されないようにします。

  4. button1 コントロールをクリックし、Label プロパティを「Validate for PWA Editing」に変更し、Name プロパティを「rbtnValidate」に変更します。

  5. ControlSize プロパティを RibbonControlSizeLarge に変更し、ScreenTip プロパティを「プロジェクトが Project Web App で編集できるかどうか検証します。プロジェクトがマスター プロジェクトである場合、あるいは、null タスク、作業時間固定のタスク、またはタスク カレンダーが含まれている場合、プロジェクトは PWA で編集できません。」に変更します。

  6. Image プロパティをクリックし (図 3)、[リソースの選択] ダイアログ ボックスを使用して画像をインポートします。たとえば、Project 2010 SDK ダウンロード内の Samples\VSTO\Project2010EditableAddIn\Resources ディレクトリにある Checkmark.png イメージをインポートします。

    図 3. 検証用のリボン ボタンのデザイン ビュー

    検証用のリボン ボタンのデザイン

  7. このボタンの [プロパティ] ウィンドウで、[イベント] アイコンをクリックし、Click イベントをダブルクリックして rbtnValidate_Click イベント ハンドラーを作成します。

  8. この click イベント ハンドラーに、エラーが検出されたときに ErrorDialog フォームを表示するコードを追加します。エラーがなかったときはメッセージ ボックスを表示します。rbtnValidate_Click イベント ハンドラーのコード全体は以下のようになります。

    // Click event handler for validation button on the ribbon.
    private void rbtnValidate_Click(object sender, RibbonControlEventArgs e)
    {
        try
        {
            ValidationRules rules = new ValidationRules(Globals.ThisAddIn.Application);
    
            if (!rules.IsValid(Globals.ThisAddIn.Application.ActiveProject))
            {
                ErrorDialog dlg = new ErrorDialog();
                dlg.SetErrors(rules.ErrorTable);
                dlg.SetErrorCount(rules.NumErrors);
                dlg.ShowDialog();
            }
            else
            {
                string msg = Globals.ThisAddIn.Application.ActiveProject.Name
                    + ":\nThis project is OK for editing in Project Web App.";
                MessageBox.Show(msg, "No Validation Errors", 
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", 
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    

ユーザーがリボンの [アドイン] タブをクリックし、[Validate for PWA Editing] をクリックすると、このアドインでプロジェクトが検証され、Project Web App で編集できなくなるエラーのリストが表示されます。エラーがなかった場合には、アドインから "No Validation Errors" というメッセージ ボックスが表示されます (図 4)。

図 4. Project Web App でプロジェクトを編集できることを示すダイアログ ボックス

プロジェクトを保存できることを示すダイアログ ボックス

アドインをイベント ハンドラーで実行する

手順 1. で ThisAddIn_Startup メソッド内にチェック用の ProjectBeforeSave2 イベントを追加したとき、Visual Studio によって Application_ProjectBeforeSave2 イベント ハンドラーのスタブが追加されました。このアドインを完成させるには、Application_ProjectBeforeSave2 イベント ハンドラーにコードを追加します。

手順 7. ProjectBeforeSave2 イベント ハンドラーを作成するには

  1. ThisAddIn.cs を開き、Application_ProjectBeforeSave2 イベント ハンドラー内の「throw new NotImplementedException();」行を削除またはコメント化します。

  2. DialogResult 列挙体を使用するために、以下の using ステートメントを追加します。

    using System.Windows.Forms;
    
  3. Application_ProjectBeforeSave2 イベント ハンドラーに、rules オブジェクトをインスタンス化して IsValid メソッドを呼び出すコードを追加します。

    // Event handler for the ProjectBeforeSave2 event.
    void Application_ProjectBeforeSave2(MSProject.Project pj, bool SaveAsUi,  MSProject.EventInfo Info)
    {
        if (pj == null) return;
    
        // Validate the project for editing in Project Web App.
        ValidationRules rules = new ValidationRules(this.Application);
    
        if (!rules.IsValid(pj))
        {
            // Show any validation errors.
            ErrorDialog dlg = new ErrorDialog();
            dlg.SetErrors(rules.ErrorTable);
            dlg.SetErrorCount(rules.NumErrors);
    
            // If the user clicks Cancel, cancel the save operation. 
            if (dlg.ShowDialog() == DialogResult.Cancel) Info.Cancel = true;
        }
    }
    

ユーザーがプロジェクトを保存するとき、ProjectBeforeSave2 イベント ハンドラーでプロジェクトがチェックされ、[Validation Errors] ダイアログ ボックスにエラーのリストが表示されます (図 5)。ユーザーが [Cancel: Do Not Save] をクリックすると、イベント ハンドラーによって Info.Cancel プロパティが true に設定され、Project の保存操作はキャンセルされます。ユーザーが [OK: Save Anyway] をクリックすると、Project でデータが保存されます。イベント ハンドラー使用時には、[No Validation Errors] メッセージ ボックスは表示されません。

図 5. Project Web App 対応エラーを示すダイアログ ボックス

Project Web App のエラーを示すダイアログ ボックス

アドインをデバッグする

Project クライアント用のアドインは、ドキュメント レベルではなくアプリケーション レベルです。Project クライアント用のアドインは簡単にデバッグできます。Visual Studio で Project クライアントが起動され、ブレークポイントで実行が中断されます。

手順 8. アドインをテストおよびデバッグするには

  1. デバッグを開始する部分にブレークポイントを設定します。たとえば、ValidationRules.cs ファイルを開き、IsValid メソッド内の string validationErr = task.Name + ": " + Properties.Resources.FIXED_WORK_TASK; ステートメントにブレークポイントを設定します。

  2. デバッグ セッションを開始する前に、Project クライアントを実行している場合は Project を終了します。

  3. Visual Studio で、F5 キーを押してデバッグを開始します。Visual Studio によって Project が起動されます。Project をローカルに実行することも、Project Server プロファイルでログオンすることもできます。Project クライアントでいくつかタスクを作成し、そのうち 1 つのタスクを作業時間固定のタスクにします。

  4. クイック アクセス ツール バーの [保存] アイコンをクリックします (またはリボンの [アドイン] タブをクリックし、[Validate for PWA Editing] をクリックします)。Visual Studio によってブレークポイントで実行が中断されます。

  5. [ローカル] ウィンドウに表示される値を確認し、F11 キーを押してステートメントごとにステップ実行し、IRules.cs ファイル内の ValidationError クラス コンストラクターまで進みます。ValidationError オブジェクトが作成されると、実行は Errorlist.Add ステートメントに戻り、次に ValidationErrors クラスの Add メソッドへ進みます。アドインで error オブジェクトが追加されると、[ローカル] ウィンドウに、this.errors オブジェクトが Count = 1 に変わったことが示されます。

アドインを展開する

Visual Studio の発行ウィザードを使用すると、簡単な ClickOnce 展開で Project アドインを展開できます。このソリューションの両方のアセンブリに、厳密な名前キーで署名する必要があります。詳細については、MSDN ライブラリの「How to: Deploy an Office Solution by Using ClickOnce」を参照してください。

手順 9. Project Professional にアドインを展開するには

  1. ソリューション エクスプローラーで、IValidationRules プロジェクトを右クリックし、[プロパティ] をクリックします。[IValidationRules] タブの [署名] タブをクリックし、[アセンブリの署名] チェック ボックスをオンにし、厳密な名前キー ファイルを作成します。たとえば、IValidationRules.snk を作成します。

  2. 同様に、Project2010EditableAddIn プロジェクトの厳密な名前キー ファイルも作成します。たとえば、Project2010Addin.snk を作成します。

  3. Project2010EditableAddIn プロジェクトを右クリックし、[発行] をクリックします。

  4. 発行ウィザードの最初のページで、既定の publish\ ディレクトリ名を、他のコンピューターでも認識しやすい名前に変更します。たとえば、Project2010EditableAddIn_Published\ という名前に変更します。[次へ] をクリックします。

  5. 発行ウィザードの 2 番目のページで、既定の [CD-ROM または DVD-ROM から] を選択します。[次へ] をクリックし、次に [完了] をクリックします。Visual Studio によって、必要に応じてプロジェクトがリビルドされ、アドインを他のコンピューターに展開するための Project2010EditableAddIn_Published\ サブディレクトリとファイルが作成されます。

  6. Project Professional 2010 がインストールされている他のコンピューターに Project2010EditableAddIn_Published\ ディレクトリをコピーします。

  7. そのコンピューターで、Project2010EditableAddIn_Published\ ディレクトリの setup.exe を実行します。Microsoft Office カスタマイズ インストーラー ウィザードで必須コンポーネントがチェックされます。ウィザードの [発行元を確認できません] ページで [インストール] をクリックします。正常にインストールできたら、[閉じる] をクリックします。

Project を実行すると、リボンの [アドイン] タブに [Validate for PWA Editing] が表示されます。いくつかタスクを作成し、作業時間固定のタスク、null タスク、およびタスク カレンダーのあるタスクも追加します。プロジェクトを保存しようとすると、図 5 のような [Validation Errors] ダイアログ ボックスが表示されます。エラーを修正してからリボンの [Validate for PWA Editing] をクリックすると、図 4 のような [No Validation Errors] メッセージ ボックスが表示されます。

まとめ

Visual Studio 2010 では、Project 2010 アドインを簡単に作成および展開できます。Project2010EditableAddIn サンプルは、プロジェクトを Project Web App で編集できるかどうか検証する Project 2010 アドインを作成および展開する方法を示しています。

関連項目

その他のリソース

Designing and Creating Office Solutions

How to: Deploy an Office Solution by Using ClickOnce