Product Documentation

アプリケーションのインポート

Jul 08, 2016

アプリケーションは、分析する前にAppDNAにインポートする必要があります。 SDKでは直接インポートとInstall Captureの2種類のインポートを使用できます。

  1. 直接インポート。 オプションで変換ファイルを伴う .msiファイルやApp-Vストリームなど、アプリケーションのソースメディアが直接インポートできる形式である場合は、この方法を使用します。
  2. Install Capture。 アプリケーションのソースメディアが従来の実行可能インストーラーである場合や、App-Vシーケンスの生成などファイルのインポート時に追加機能を実行したい場合は、この方法を使用します。

直接インポート

すべてのインポートが、Server.Applicationsプロパティにより戻されるオブジェクトを通じて実行されます。 オーバーロードされた任意のImportメソッドを使用して、直接インポートを実行できます。 インポートごとに、ログファイルを格納する出力フォルダーを指定する必要があります。

以下の例は、単一のmsiをインポートする方法を説明しています。

-command コピー

using AppDNA = Citrix.SDK.AppDNA;

AppDNA.Server appdna;

// Connect the appdna variable to the server

//…

public AppDNA.Application Import(string msiSourceFile)

{

   //Create a folder for the log files and other output.

   string outputFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

   outputFolder = Path.Combine(outputFolder, "AppDNASample");

   Directory.CreateDirectory(outputFolder);

   string logFile = null;

   AppDNA.Application app = appdna.Application.Import(msiSourceFile, outputFolder, out logFile);

   Console.WriteLine("Import log saved to " + logFile);

   return app;

}

ほかのオーバーロードでは、msiをインポートする前に適用する必要がある変換ファイルや、そのほかの構成情報を指定できます。

バッチインポート

複数のアプリケーションをインポートする場合は、Applicationオブジェクトを戻すImportのオーバーロードは便利ではありますが効率的ではありません。 AppDNA SDKではバッチインポートがサポートされ、複数のアプリケーションについてインポートの詳細を指定できます。 Importオブジェクトが戻されることにより、SDKでバッチインポートの進行状況を監視し、インポートされたファイルごとに、結果として生じるApplicationオブジェクトを取得できます。

Importオブジェクトでは、結果およびそのほかの情報を取得するキーとして、Import関数に渡される各ImportSourceDetailsオブジェクトを使用します。

以下の例は、ソースファイルパスの列挙可能なコレクションに応じて、バッチインポートを実行する方法を説明しています。

Code コピー

public Dictionary<string,AppDNA.Application> Import(IEnumerable<string> msiSourceFiles)

{

   //Create a folder for the log files and other output.

   string outputFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

   outputFolder = Path.Combine(outputFolder, "AppDNASample");

   Directory.CreateDirectory(outputFolder);

   // Build a list of ImportSourceDetails

   var importDetails = new List<AppDNA.ImportSourceDetails>();

   foreach (var sourceFile in msiSourceFiles)

   {

      importDetails.Add(new AppDNA.ImportSourceDetails(sourceFile));

   }

   // Build a result object to hold the imported applications

   var result = new Dictionary<string, AppDNA.Application>();

   // Start the import and wait for completion

   using (var import = appdna.Application.Import(importDetails, outputFolder))

   {

      import.WaitForCompletion();

      //Enumerate through the ImportSourceDetails objects and use them as a key to get the results.

      foreach (var detail in importDetails)

      {

         string msg = string.Format("Import log for {0} saved to {1}", detail.SourceFilePath, import.GetLogFilePath(detail));

         Console.WriteLine(msg);

         AppDNA.Application app = null;

         try

         {

            app = import.GetApplication(detail);

         }

         catch (Exception error)

         {

            msg = string.Format("Failed to import {0} due to error: {1}", detail.SourceFilePath, error.Message);

            Console.WriteLine(msg);

         }

         if (app != null)

            result.Add(detail.SourceFilePath, app);

      }

   }

   return result;

}

ApplicationImportConfigurationオブジェクトを取るImportメソッドのオーバーロードを使用して、さらにインポートを構成できます。 ImportSourceDetailsクラスのほかのプロパティを使用することもできます。

Install Capture

Install Captureでは、仮想マシン構成と実行プロファイルを使用して仮想マシン内でコマンドのセットを実行し、AppDNAにインポートできるインストールを生成します。 たとえば、従来のsetup.exeのスナップショットを作成して、インポートできるmsiを生成することができます。

Install Captureを使用する前に、AppDNAのGUIクライアントを使用して仮想マシン構成と実行プロファイルを構成します。 Install Captureでは、前に示したバッチインポートと同じ方法を使用します。

-command コピー

public Dictionary<string, AppDNA.Application> InstallCapture(IEnumerable<string> legacySetupFiles)

{

   //Create a folder for the log files and other output.

   string outputFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

   outputFolder = Path.Combine(outputFolder, "AppDNASample");

   Directory.CreateDirectory(outputFolder);

   // Build a list of InstallCaptureSourceDetails

   var importDetails = new List<AppDNA.InstallCaptureSourceDetails>();

   foreach (var sourceFile in legacySetupFiles)

   {

       importDetails.Add(new AppDNA.InstallCaptureSourceDetails(sourceFile));

   }

   // Build a result object to hold the imported applications

   var result = new Dictionary<string, AppDNA.Application>();

   // Start the install capture specifying the VMConfiguration and Execution Profile and wait for completion

   using (var import = appdna.Application.InstallCapture(importDetails, "MyVMConfiguration", "Snapshot", outputFolder))

   {

      import.WaitForCompletion();

      //Enumerate through the ImportSourceDetails objects and use them as a key to get the results.

      foreach (var detail in importDetails)

      {

         string msg = string.Format("Import log for {0} saved to {1}", detail.SourceFilePath, import.GetLogFilePath(detail));

         Console.WriteLine(msg);

         AppDNA.Application app = null;

         try

         {

            app = import.GetApplication(detail);

         }

         catch (Exception error)

         {

            msg = string.Format("Failed to import {0} due to error: {1}", detail.SourceFilePath, error.Message);

            Console.WriteLine(msg);

         }

         if (app != null)

            result.Add(detail.SourceFilePath, app);

      }

   }

   return result;

}

InstallCaptureConfigurationオブジェクトを取るInstallCaptureメソッドのオーバーロードを使用して、さらにInstall Captureを構成できます。 InstallCaptureSourceDetailsクラスのほかのプロパティを使用することもできます。

インポートの進行状況の表示

バッチインポートの実行時に任意のファイルのインポート状態を取得するには、Import.GetProcessingStateメソッドを使用します。 これにより、そのファイルの現在のインポート状態の詳細を提供するオブジェクトが戻されます。 INotifyPropertyChangedも実装されており、インポート状態が変化したときの通知を登録することができます。

SynchronizationContexts

ApplicationImportConfigurationクラスおよびInstallCaptureConfigurationクラスにより、SynchronizationContextプロパティが公開されます。 これにより、登録済みのイベントを発生させるために使用されるスレッドが定義されます。たとえば、ProcessingState.PropertyChangedイベントを登録した場合です。

デフォルトでは、使用されるSynchronizationContextはApplicationImportConfigurationクラスおよびInstallCaptureConfigurationクラスが作成されるときのSynchronizationContext.Currentの値です。 バックグラウンドスレッドまたはコンソールアプリケーションでは通常これはnullですが、このプロパティは手動でnullに設定することもできます。 nullのSynchronizationContextは、イベントが任意のThreadPoolスレッドで発生することを意味します。 イベントハンドラーからGUIコンソールにアクセスするには、呼び出しをGUIスレッドに向けます。

WinFormsまたはWPFアプリケーションのGUIスレッドで、SynchronizationContextは適切なSynchronizationContextにデフォルト設定され、同じGUIスレッドでイベントが発生するため任意のGUIコントロールに直接アクセスできます。

Import.WaitForCompletion()メソッドは現在のスレッドのSynchronizationContextをブロックしませんが、たとえばGUIスレッドから呼び出されるGUIイベントに引き続き対応します。 GUIイベントに対応せずに完了を待機するには、Thread.Sleep(…)呼び出しをループ内で使用して、Import.IsFinishedが完了するまで待機することができます。