トップ回答者
VS2005IDE 機能追加方法

質問
-
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"
回答
-
こんにちは、ファクトです。
こんな感じのマクロコードでどうでしょうか?以下のマクロを登録した後、オプションのキーボード設定でショートカット設定をすれば、実現できるのではないかと思います。
コード ブロックImports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.IOPublic 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 TrueEnd 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
すべての返信
-
こんにちは、ファクトです。
こんな感じのマクロコードでどうでしょうか?以下のマクロを登録した後、オプションのキーボード設定でショートカット設定をすれば、実現できるのではないかと思います。
コード ブロックImports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.IOPublic 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 TrueEnd 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