0

c# .net で Windows サービスを構築しています。ビルド時にサービスを自動的にデプロイするために、ビルド前およびビルド後のイベントを追加しました。しかし、いつかこのエラーが発生しました:

ファイル "[CompletPath...]\bin\Debug\Business.Data.dll" を "bin\Debug\Business.Data.dll" にコピーできません。別のプロセスで使用されているため、プロセスはファイル 'bin\Debug\Business.Data.dll' にアクセスできません。

Pre-Build イベントでは、サービスを閉じて、Debug ディレクトリ内のファイルを使用するすべてのタスクを強制終了し、サービスをアンインストールしています。Pre-Build イベントで実行している .bat にコードがあります。

SET executionPath=%~dp0
SET serviceName=%1
SET frameworkPath=%2
SET targetServicePath=%3
SET targetBinPath=%~4
set targetBinPath=%targetBinPath:~0,-2%

net stop %serviceName%
powershell -NonInteractive -executionpolicy Unrestricted -file "%executionPath%\unlockfiles.ps1" "%targetBinPath%"
%frameworkPath%\installutil.exe /u %targetServicePath%

Exit /b 0

サービスをインストールして開始しているビルド後のイベントでは、ビルド時にエラーが発生しているため、これが問題でなくてもコードがあり、ビルド後のイベントが実行されていません。

SET serviceName=%1
SET frameworkPath=%2
SET targetServicePath=%3

%frameworkPath%\installutil.exe /ShowCallStack %targetServicePath%
net start %serviceName%

私はいつも問題を抱えているわけではありません。私は通常、最初にビルドするときに問題を抱えています。ソリューションをクリーニングし、再度ビルドすると、通常はこの後に機能します。

4

2 に答える 2

1

私があなたなら、これらのプロセスを分離します。ファイルを更新するためにサービスをアンインストールする必要はありません。

私はビルドの完了後にいくつかのファイルを移動する以上の理由で、ビルド前後のイベントの大ファンではありません。

xcopy /y /c "$(TargetPath)" "コピー先の場所" を使用します

メモリが機能する場合、dll を更新するために実際にサービスを停止する必要さえありませんでしたが、xcopy コマンドを実行する前に、ポスト ビルドでサービスを停止する必要がある場合があります。

于 2013-04-30T10:51:20.470 に答える
0

私があなたの状況にいたら、よりチーム指向のソリューションを採用し始めます。

Team Cityなどを使用して、継続的インテグレーション システムのセットアップに時間を費やします(このツールは、最大 20 のビルド構成で無料です。JetBrains のすべてを本当に評価します。

その後、チームの 1 人がサービスの新しいソース コードをチェックインするたびに、ビルド システム (Team City) によって自動的に検出され、新しいビルド セットがトリガーされます。

コードに対して単体テストを実行するデバッグ ビルドと、サービスのインストーラーをビルドするWiX プロジェクトを含むリリース ビルドを作成できます。

これらのプロセスが完了したら、ネットワーク上の既知の場所にインストーラーをポップするように構成できます。また、チームのすべての開発者にメールを送信して、サービスの新しいバージョンをインストールできることを通知することもできます。

WiX は非常に成熟したインストール オーサリング ツールであり、Microsoft が多くの製品で使用しています。ツールセットには多くのサポートがあり、プロセス全体をより厳密に、再現可能で予測可能にします.

これをすべて完了するには少し時間がかかりますが、努力する価値はあります。

于 2013-05-01T20:50:14.960 に答える