none
VS2005IDE 機能追加方法 RRS feed

  • 質問

  •   GUI部分の開発中によくビルド済みのものと比較しながらデザイン・動作確認等を行いたい場合があります。

    CTRL-F5にて起動すれば、同様のことが可能ではあるのですが、(当たり前ですが)再ビルドする際には
    起動しているアプリケーションを終了しなければならず、かつ再度実行時には最新のビルドのものとなって
    しまいます。

     それを避けるために今は、下記の様なバッチを使っておりますが、こちらのような機能をIDEに組み込み
    かつショートカットキーにて割り当てることができないものでしょうか。
    (IDEのマクロを使えば簡単にできるかと思ったのですが、アクティブなプロジェクトのパスや、ファイルの取得方法を
    見つけることができませんでした。)

    方法は、どのようなものでもかまわないのですが、実装する方法を教授いただけませんでしょうか。


    次の機能を VS2005IDE上の機能として追加したい。

     

    CTRL+0 押下時:
     ・スタートアッププロジェクトのビルド
     ・スタートアッププロジェクトの生成ファイルをプロジェクトのテンポラリフォルダにコピー。

    CTRL+ALT+F5 押下時:
     ・スタートアッププロジェクトのテンポラリフォルダ内の実行ファイルを起動。
       (スタートアッププロジェクトのアセンブリ名と同名のファイル)

     

    <現在使用しているバッチ>
    -=-=-=-=-=-=-=-=-=-=-=-= ビルド後のイベント用バッチ -=-=-=-=-=-=-=-=-=-=-=-=
    REM スタートアッププロジェクト内のbin\以下をコピー(サブフォルダを含む)
    REM 実際には、ビルド後イベントにてマクロ変数を使ってパスを指定しています。
    mkdir "d:\Projects\SampleSolution\sampleProject\temp\debug"
    xcopy "d:\Projects\SampleSolution\sampleProject\bin\debug" "d:\project\SampleSolution\sampleProject\Temp\debug" /S /E /H /C /Y /R

    -=-=-=-=-=-=-=-=-=-=-=-= 起動用バッチファイル -=-=-=-=-=-=-=-=-=-=-=-=
    REM コピーした実行ファイルを起動
    REM 今は、プロジェクト毎に作成しています・・・。
    "d:\project\SampleSolution\sampleProject\Temp\debug\sample.exe"

    2007年12月9日 8:01

回答

  • こんにちは、ファクトです。

    こんな感じのマクロコードでどうでしょうか?以下のマクロを登録した後、オプションのキーボード設定でショートカット設定をすれば、実現できるのではないかと思います。

     

    コード ブロック

    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports System.Diagnostics
    Imports System.IO

     

    Public Module BuildToolsModule

     

      'ビルドしてテンポラリディレクトリで実行する
      Public Sub TempBuildRun()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        '現在の構成でビルドする
        Call buildSolution()

     

        'ビルド結果をテンポラリにコピーする
        Dim executeTempFile As String = copyOutputFileToTemp(True)

     

        'テンポラリの実行ファイルを起動する
        Call executeFile(executeTempFile)

     

      End Sub

     

      'ビルドしてテンポラリディレクトリへコピーする
      Public Sub TempBuild()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        '現在の構成でビルドする
        Call buildSolution()

     

        'ビルド結果をテンポラリにコピーする
        Dim executeTempFile As String = copyOutputFileToTemp(True)

     

      End Sub

     

      'テンポラリディレクトリの実行ファイルを実行する
      Public Sub TempRun()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        'ビルド結果をテンポラリにコピーした際のパスを取得する(コピーはしない)
        Dim executeTempFile As String = copyOutputFileToTemp(False)

     

        'テンポラリの実行ファイルを起動する
        Call executeFile(executeTempFile)

     

      End Sub

     

      '実行できるかチェック
      Private Function canExecute() As Boolean

     

        'ソリューションがロードされていなければ実行できない
        If DTE.Solution.Count = 0 Then Return False

     

        'チェックに引っかからなければ実行できる
        Return True

     

      End Function

     

      'ソリューションをビルドする
      Private Sub buildSolution()

     

        '現在の構成でビルドする
        DTE.Solution.SolutionBuild.Build(True)

     

      End Sub

     

      'スタートアッププロジェクトのビルドファイルをコピーする
      Private Function copyOutputFileToTemp(ByVal actualCopy As Boolean) As String

     

        'スタートアッププロジェクト情報を取得
        Dim startupProjectName As String = DTE.Solution.SolutionBuild.StartupProjects(0)
        Dim startupProject As EnvDTE.Project = DTE.Solution.Projects.Item(startupProjectName)
        Dim startupProjectPath As String = startupProject.FullName
        Dim startupProjectDir As String = System.IO.Path.GetDirectoryName(startupProjectPath)

     

        '実行ファイルの出力先情報を取得
        Dim outputFileName As String = startupProject.Properties.Item("OutputFileName").Value
        Dim outputFileDir As String = startupProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value

     

        'コピー元・コピー先ディレクトリを取得
        Dim executeDir = Path.Combine(startupProjectDir, outputFileDir)
        Dim executeTempDir = Path.Combine(Path.Combine(startupProjectDir, "Temp"), outputFileDir)

     

        'ディレクトリごとコピーする
        If (actualCopy) Then
          My.Computer.FileSystem.CopyDirectory(executeDir, executeTempDir, True)
        End If

     

        'テンポラリの実行ファイル名を復帰
        Return Path.Combine(executeTempDir, outputFileName)

      End Function

     

      'ファイルを実行する
      Private Sub executeFile(ByVal filePath As String)

     

        'テンポラリの実行ファイルを起動する
        Call Shell(filePath, AppWinStyle.NormalFocus, False)

     

      End Sub

     

    End Module

     

     

    2007年12月13日 2:52

すべての返信

  • こんにちは、ファクトです。

    こんな感じのマクロコードでどうでしょうか?以下のマクロを登録した後、オプションのキーボード設定でショートカット設定をすれば、実現できるのではないかと思います。

     

    コード ブロック

    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports System.Diagnostics
    Imports System.IO

     

    Public Module BuildToolsModule

     

      'ビルドしてテンポラリディレクトリで実行する
      Public Sub TempBuildRun()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        '現在の構成でビルドする
        Call buildSolution()

     

        'ビルド結果をテンポラリにコピーする
        Dim executeTempFile As String = copyOutputFileToTemp(True)

     

        'テンポラリの実行ファイルを起動する
        Call executeFile(executeTempFile)

     

      End Sub

     

      'ビルドしてテンポラリディレクトリへコピーする
      Public Sub TempBuild()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        '現在の構成でビルドする
        Call buildSolution()

     

        'ビルド結果をテンポラリにコピーする
        Dim executeTempFile As String = copyOutputFileToTemp(True)

     

      End Sub

     

      'テンポラリディレクトリの実行ファイルを実行する
      Public Sub TempRun()

     

        'プロジェクトをロードしていない状態なら無視する
        If canExecute() = False Then Exit Sub

     

        'ビルド結果をテンポラリにコピーした際のパスを取得する(コピーはしない)
        Dim executeTempFile As String = copyOutputFileToTemp(False)

     

        'テンポラリの実行ファイルを起動する
        Call executeFile(executeTempFile)

     

      End Sub

     

      '実行できるかチェック
      Private Function canExecute() As Boolean

     

        'ソリューションがロードされていなければ実行できない
        If DTE.Solution.Count = 0 Then Return False

     

        'チェックに引っかからなければ実行できる
        Return True

     

      End Function

     

      'ソリューションをビルドする
      Private Sub buildSolution()

     

        '現在の構成でビルドする
        DTE.Solution.SolutionBuild.Build(True)

     

      End Sub

     

      'スタートアッププロジェクトのビルドファイルをコピーする
      Private Function copyOutputFileToTemp(ByVal actualCopy As Boolean) As String

     

        'スタートアッププロジェクト情報を取得
        Dim startupProjectName As String = DTE.Solution.SolutionBuild.StartupProjects(0)
        Dim startupProject As EnvDTE.Project = DTE.Solution.Projects.Item(startupProjectName)
        Dim startupProjectPath As String = startupProject.FullName
        Dim startupProjectDir As String = System.IO.Path.GetDirectoryName(startupProjectPath)

     

        '実行ファイルの出力先情報を取得
        Dim outputFileName As String = startupProject.Properties.Item("OutputFileName").Value
        Dim outputFileDir As String = startupProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value

     

        'コピー元・コピー先ディレクトリを取得
        Dim executeDir = Path.Combine(startupProjectDir, outputFileDir)
        Dim executeTempDir = Path.Combine(Path.Combine(startupProjectDir, "Temp"), outputFileDir)

     

        'ディレクトリごとコピーする
        If (actualCopy) Then
          My.Computer.FileSystem.CopyDirectory(executeDir, executeTempDir, True)
        End If

     

        'テンポラリの実行ファイル名を復帰
        Return Path.Combine(executeTempDir, outputFileName)

      End Function

     

      'ファイルを実行する
      Private Sub executeFile(ByVal filePath As String)

     

        'テンポラリの実行ファイルを起動する
        Call Shell(filePath, AppWinStyle.NormalFocus, False)

     

      End Sub

     

    End Module

     

     

    2007年12月13日 2:52
  • ファクト様ご回答ありがとうございます。

     

    マクロの方にちゃんと、スタートアップ等を取得する方法があったのですね。

    結構探していたつもりなのですが、どこをさがしていたのやら・・面目ありません。

     サンプルソースまで提供いただき、申し訳ありません。

     

    大変勉強になりました。

     

     

     

     

     

    2007年12月13日 4:27