Xamarin Studioをもう少し良くする方法は?

画像



XamarinとC#を使用してモバイルアプリケーションの開発を開始してから1年半が経ちました。 この間、XamarinのメンバーはIDEを徹底的に開発したので、iMac-Xamarin-Genymotionを支持してiMac-Parallels Desktop-Visual Studio-Androidバンドルを喜んで拒否しました。 ただし、Xamarin Studioはまだいくつかのアクションを手動で実行する必要があるレベルにありますが、これを1日に5、10、15回以上実行する必要がある場合はどうでしょうか? 簡単な答えは、すべての作業を行うアドインを作成してXamarin Studioをアップグレードすることです。 この記事では、単純なアドインの作成方法と、より深刻な何かが必要な場合の移動先について説明します。



準備する



アドインを作成するには、次のものが必要です。



リストは長くありません。 アドインメーカーは次のようにインストールされます。

  1. Xamarin Studioを開き、アドオンマネージャーに移動します



    画像

  2. アドオンマネージャーで、[ギャラリー]タブを選択し、アドインメーカーの検索バーに移動します。 マネージャーがアドインを見つけたらすぐにインストールする



    画像





突然、アドオンマネージャーがそのようなアドインを見つけられなかった場合は、 こちらで入手してください

アドインメーカーをインストールした後、Xamarin Studioを再起動します。 これですべての準備が整いました。



アドインの目的



作成について説明するアドインの主な唯一の目的は、ボタンをクリックするだけでプロジェクトのメインディレクトリにあるbinおよびobjフォルダーを削除することです。 MacでXamarin Studioを使用する場合、プロジェクトがAndroidでデバッグされているかiOSでデバッグされているかに関係なく、そのような操作は1時間に数回実行されることがあります。



プロジェクト作成



Xamarin Studioでプロジェクトを作成するには、[新しいソリューション]> [C#]> [Xamarin Studio]> [Xamarin Studioアドイン]を選択し、名前を入力して場所を選択します。



画像



プロジェクトを作成すると、その構造は次のようになります。



画像



AddinInfoとAssemblyInfoは、その名前が示すように、それぞれアドインとアセンブリに関する情報を保持しています。 Manifest.addinでは、作成された拡張機能のモデルが説明されています。 したがって、それを開き、次の行を処方します。



<?xml version="1.0" encoding="UTF-8"?>  <ExtensionModel>  <Extension path = "/MonoDevelop/Ide/Commands"> <Command id = "BinObjCleaner.BinObjCleanerCommands.DeleteBinObj" _label = "Delete bin/obj" _description = "Delete /bin and /obj folders in every solution project"  defaultHandler = "BinObjCleaner.DeleteBinObjHandler" />  </Extension>  <Extension path = "/MonoDevelop/Ide/MainMenu/Build">  <CommandItem id="BinObjCleaner.BinObjCleanerCommands.DeleteBinObj" /> </Extension> </ExtensionModel>
      
      





そして今、順番に。 行:



 <Extension path = "/MonoDevelop/Ide/Commands">
      
      





彼女はアドインがどのカテゴリに属する​​かについて話します。 ボタンを作成しているため、カテゴリは「コマンド」になります。ファイルテンプレートを作成した場合は、「FileTemplates」をカテゴリとして指定する必要があります(もちろん、これは2つのカテゴリに限定されません)。 どうぞ



 <Command id = "BinObjCleaner.BinObjCleanerCommands.DeleteBinObj" _label = "Delete bin/obj" _description = "Delete /bin and /obj folders in every solution project" defaultHandler = "BinObjCleaner.DeleteBinObjHandler" />
      
      





設定は次のとおりです。



次の行:



 <Extension path = "/MonoDevelop/Ide/MainMenu/Build"> <CommandItem id="BinObjCleaner.BinObjCleanerCommands.DeleteBinObj" />
      
      





IDEで特定のIDを持つアドイン(この場合はボタン)の場所を決定します。 つまり、アドインを開始すると、次のボタンが表示されます。



画像



私たちはこの目標に向かって動き続けています。 ここで、空の列挙型を作成する必要があります(プロジェクトを右クリックし、[追加]> [新しいファイル])



画像



そしてそれを書いてください:



 using System; namespace BinObjCleaner { public enum BinObjCleanerCommands { DeleteBinObj } }
      
      





Manifest.addinの次の行のenumプロジェクトにこれを追加しました。



 <Command id = «BinObjCleaner.BinObjCleanerCommands.DeleteBinObj"
      
      





次に、enumのような空のクラスを作成します。



画像



これで、ボタンのハンドラーとしてManifest.addinで指定したクラスが追加されました。



 defaultHandler = "BinObjCleaner.DeleteBinObjHandler"
      
      





CommandHandlerから継承し、2つのメソッド、RunとUpdateを再定義します。 以下を取得する必要があります。



 using System; using MonoDevelop.Components.Commands; using MonoDevelop.Ide; using MonoDevelop.Core;  namespace BinObjCleaner { public class DeleteBinObjHandler : CommandHandler { protected override void Run () { }  protected override void Update (CommandInfo info) { } } }
      
      





Updateメソッドをオーバーライドすることは、ボタンの可視性を制御するために必要です。 解決策が開いていない場合は、binおよびobjフォルダーを削除する必要がある解決策が明確ではないため、ボタンは表示されません。 これを行うには、Updateメソッドに1行追加します。



 info.Visible = IdeApp.Workspace.IsOpen;
      
      





Runメソッドをオーバーライドすると、binおよびobjフォルダーの削除に関連するすべてのロジックが含まれます。 このメソッドは、ボタンをクリックした後に呼び出されます。 フォルダーを削除する前に、ソリューションが実行中かどうか、または既にビルド中かどうか、およびこれらの操作が完了したことを確認する必要があります。 Runメソッドに次のコードを追加します。



 var projectOperation = IdeApp.ProjectOperations; var isBuild = projectOperation.IsBuilding (projectOperation.CurrentSelectedSolution); var isRun = projectOperation.IsRunning (projectOperation.CurrentSelectedSolution); if (!isBuild && !isRun && IdeApp.ProjectOperations.CurrentBuildOperation.IsCompleted && IdeApp.ProjectOperations.CurrentRunOperation.IsCompleted) { }
      
      





したがって、ソリューションで実行できる操作のリストを取得し、ソリューションが開始/完了したかどうか、ソリューションが開始/終了したかどうかを確認します。

binフォルダーとobjフォルダーを削除しても問題が解決しないことを確認したら、ソリューションに含まれるプロジェクトのリストを取得する必要があります。これを行うには、if内に次の行を追加します。



 var solutionItems = projectOperation.CurrentSelectedSolution.Items;
      
      





ソリューション内のプロジェクトのリストがわかったので、各プロジェクトへのパスに沿って、「/ bin」または「/ obj」を追加し、それらの存在を確認した後にこれらのフォルダーを削除するだけです。



 foreach (var item in solutionItems) { var binPath = item.BaseDirectory.FullPath + "/bin"; if (FileService.IsValidPath (binPath) && FileService.IsDirectory (binPath)) FileService.DeleteDirectory (binPath);  var objPath = item.BaseDirectory.FullPath + "/obj"; if (FileService.IsValidPath (objPath) && FileService.IsDirectory (objPath)) FileService.DeleteDirectory (objPath); }
      
      





その結果、DeleteBinObjHandlerは次のようになります。



 using System; using MonoDevelop.Components.Commands; using MonoDevelop.Ide; using MonoDevelop.Core; namespace BinObjCleaner { public class DeleteBinObjHandler : CommandHandler { protected override void Run () { var projectOperation = IdeApp.ProjectOperations; var isBuild = projectOperation.IsBuilding (projectOperation.CurrentSelectedSolution); var isRun = projectOperation.IsRunning (projectOperation.CurrentSelectedSolution);  if (!isBuild && !isRun && IdeApp.ProjectOperations.CurrentBuildOperation.IsCompleted && IdeApp.ProjectOperations.CurrentRunOperation.IsCompleted) { IdeApp.Workbench.StatusBar.BeginProgress("Deleting /bin and /obj folders");  var solutionItems = projectOperation.CurrentSelectedSolution.Items; foreach (var item in solutionItems) { var binPath = item.BaseDirectory.FullPath + "/bin"; if (FileService.IsValidPath (binPath) && FileService.IsDirectory (binPath)) FileService.DeleteDirectory (binPath);  var objPath = item.BaseDirectory.FullPath + "/obj"; if (FileService.IsValidPath (objPath) && FileService.IsDirectory (objPath)) FileService.DeleteDirectory (objPath); }  IdeApp.Workbench.StatusBar.EndProgress (); IdeApp.Workbench.StatusBar.ShowMessage ("Deleted successfully"); } } protected override void Update (CommandInfo info) { info.Visible = IdeApp.Workspace.IsOpen; } } }
      
      







IDEバーのステータスに関連するすべて(IdeApp.Workbench.StatusBar)は、削除プロセスが開始または終了したことをユーザーに視覚的に通知するために必要です。 次のようになります。



画像



プロジェクトを作成するだけで、ソリューションを収集し、.mpackにパックして公式リポジトリに公開したり、同僚に配布したりできます。



アドインを公開



私のように、内部で使用するアドインを作成する場合、コンソールでコマンド「mdtool setup pack BinObjCleaner.dll」を実行するだけで十分です。



画像



.mpack(Macからビルドしている場合は、ホームフォルダーにあります)を必要な人に配布します。 インストールは、ファイルからのインストールを使用してXamarin Studioのアドオンマネージャーを介して行われます(Xamarin Studio>アドインマネージャー>ファイルからインストール)。

公式リポジトリにアップロードすることに決めた場合、残念ながら、私はリンクでしか助けることができません、なぜなら どんなに一生懸命試みても、アセンブリ中に多くのエラーを突破できませんでした。



次はどこへ行きますか? 結論の代わりに



単純なアドインを作成した後、Xamarin Studioを拡張する可能性に気付いたとき、たとえば、作成時のコントローラーの自動登録など、追加ロジックを使用して内部開発用のソリューションおよびプロジェクトテンプレートを作成することにしました(初心者が犯す最もよくある間違いは、コントローラーの登録を忘れることです:-))。 このアドインとアドインのソースコードは、記事で説明されていますが、githubのこちらこちらで見つけることができます

次のリソースは、両方を書くのに非常に役立ちました。



Xamarin Studioの拡張オプションは非常に広範囲であり、おそらくあなたのニーズによってのみ制限されるため、ご自身や同僚の生活を単純化することをためらわないでください。



以上で、この記事がお役に立てば幸いです。 読んでくれてありがとう!



All Articles