kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Visual Studioでのビルド時にCOMコンポーネントでエラーが出る場合の対処

Visual Studio 2017(15.9.13)で発生しています。ある程度大いC++プロジェクトをビルドすると、突然こんなエラーが出るようになりました。

1>------ ビルド開始: プロジェクト: , 構成: Debug Win32 ------
1>エラー HRESULT E_FAIL が COM コンポーネントの呼び出しから返されました。
1>エラー:エラー HRESULT E_FAIL が COM コンポーネントの呼び出しから返されました。

一度このエラーが出ると、OS再起動、ソリューションクリーンアップとフルビルドしてもダメでした。Developer Communityにも報告されているので、そこそこ頻繁に出るようです。

developercommunity.visualstudio.com

Visual Studio 2019で同じソリューション開いても(toolsetやSDKはVS2017のままアップグレードしない)ビルドはできます。

最初についていた回避方法はこんなものでした。

  1. Developer Command Prompt for VS2017を管理者として実行する。
  2. "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PublicAssemblies"に移動する
  3. gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dll と実行する

自分の場合、上記の方法では直らなくて困っていたんですが、先日あらたな回避方法が追加されて、これで直りました。

  1. ソリューションファイルのあるフォルダーにある.vsフォルダー(隠しフォルダーです)を削除
  2. bin/objフォルダーを削除

やっぱりVSが変な挙動する場合、.vsフォルダーを削除するというのが鉄板の回避方法のようです。拡張機能なら拡張機能のキャッシュフォルダーを削除する。

Azure DevOpsでのCIとファイルエンコーディング

Azure Pipelinesでビルドすると、こんなエラーが出てしまいました。

f:id:kkamegawa:20181120063311p:plain

ローカルのVisual Studioでは問題なくビルドできます。このエラーはここで出ています。

testStep.Step = new string[] {"ブラウザ起動", "ログイン", "About表示", "終了" };

原因は「表」の字ですね。「表」には\と同じコードである0x5cを含んでいるので、エンコーディングエラーが発生しています。昔からCコンパイラとか使っている人にはおなじみです。

何故ローカルで出なくて、Azure Pipelinesで起きるかといえば、PipelinesのMicrosoft Hosted Agentは英語版OSで動いているため、Visual Studio 2017の標準エンコーディングであるSHIFT-JISのファイルが解釈できないからです。ローカルでは日本語OSなので、SHIFT-JISで問題がないと。

回避するにはソースファイルをUTF-8で保存しましょう。ファイル保存時にやってもいいですが、こういう拡張機能を使うと楽です。

marketplace.visualstudio.com

ロケールに依存するようなテストも発生します。こちらは逆で、USロケールに依存するようなテストがローカルの日本語OSではFailになるということが起きえます。今は見てないですが、昔のCoreFXのUnit Testにもそういうところがありました。

Azure Pipelinesに限らないと思いますが、ベースのOSでこういうところに引っかかることがあるので、気を付けてください。

Visual Studio 2017でMStestが実行できない場合の対処(System.Runtime, Version=4.1.1.0または依存関係の1つが読み込めないエラー)

二日ほどドはまりしました。Visual Studio 2017(15.7.1)でフル .NETでプログラムを作っていたのですが、ある日からMSTestを使ったUnit testの実行時こんなエラーが出るようになりました。

実行プログラム 'executor://mstestadapter/v2' の呼び出し中に例外が発生しました: 
ファイルまたはアセンブリ 'System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、
またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

ターゲットフレームワークを 4.5から4.7.2までいろいろ変えても駄目。どうもNuGetからライブラリーを追加してからのようで、プロジェクトテンプレートから作ったような足し算するような素のプロジェクトでは起きません。

csprojの 方法: 自動バインディング リダイレクトを有効/無効にする | Microsoft Docsを無効にするという方法も駄目。探しまくったら対処方法がありました。

github.com

  • MSTestのプロジェクトテンプレートに追加されているMicrosoft.VisualStudio.TestPlatform.TestFrameworkと同Extensionsを削除する
  • 代わりに参照からC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll" を追加する

「単体テストを作る」から作ったMSTestの参照状態。

f:id:kkamegawa:20180516142712p:plain

この状態だと実行できないですが、Microsoft.VisualStudio.TestPlatform.TestFrameworkで始まるアセンブリを二つ消して、前述のC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dllを追加します。

こんな感じになっていれば実行できるはずです。少なくとも私は大丈夫でした。

f:id:kkamegawa:20180516142521p:plain

デバッグに便利な拡張機能RevDeBug

はじめに

RevDebugという会社から「RevDebugってツールあるんだけど」と案内が来たので、試しに使ってみました。ProfilingTime Machineデバッグ情報の共有とかはチーム開発するときに便利そうです。

.NET Core 2.0以降や.NET Framework 4.5以降のサポートだそうです。既知の問題もちょっとあるのでこれに該当する人は少し待ちましょう。

Requirements for RevDeBug

  • いくつかのC# / VB.NET 15.0構文をサポートしていない
  • ASP.NET Core/ASP.NET MVCのUnhandled exceptionsが記録されない
  • ASP.NET Coreのhttpリクエストが記録されない
  • References with aliases other than global are not supported.
  • アンチウィルスのAvastを使っている場合、デバッグが記録されないので、ホワイトリストに入れて

Value Prompts

Value Prompts

これは無償版でも使える機能ですね。いちいちローカルやウォッチウィンドウを開かなくても変数の上に現在の値を表示してくれます。OzCodeにも同じような機能があります。

Monitoring

Monitoring

すべての例外を一か所のウィンドウで確認する機能ですね。メニューのReDebugからExceptions/Searchを表示します。

Profiling

Profiling

  • 実行範囲の上位10メソッドを円グラフで表示
  • もっとも呼び出されている上位5メソッドを棒グラフで表示
  • エディタの行番号の隣に処理時間に応じて色付けされる
  • RevDeBugメニューのPerformanceをクリックすると、呼び出し回数、処理時間をまとめて表示するウィンドウが表示

結構便利そうですね。

Time Machine

Time Machine

IntelliTraceをもっと便利にしたTime Machineといえばいいんでしょうか。矢印記号をクリックすれば前後のステップに移動できます。State Dataを使って、現在ステップの状態も取れます。マルチスレッドなどでは便利そうです。

Call StackScope Stackでは任意の呼び出し元に移動できます。Scope StackはVisual Studioにない機能のはずなので、(やめたほうがいいけど)多段呼び出しになっているような場合はうれしいですね。

Session Recording

Session Recording

以前やったデバッグ、あれどうだったっけ?と思うことはないでしょうか?Session Recordingを使えば、デバッグの記録ができます。IntelliTraceでも同じような感じですね。まだ深く使ってないので、どちらが、とはいえないですが、これもやはり高速なディスク上に保存するといいと思います。これは単独で使うものではなく、どちらかといえば、次の共有機能とセットでしょう。

記録ファイルは%userprofile%の下、具体的には以下の場所に入っています。

%userprofile%\documents\RevDeBug\SolutionName\Recordings

Share your recordings and save them for later use by others

Share your recordings and save them for later use by others

最近Visual Studio Codeでは複数の端末間で同じコードのデバッグができるようになりましたが、時差があるような場所にいる人にデバッグを頼むとか、オフラインの場所ではそれも難しいですね。そんなとき、このSession Recordingで記録した情報を送れば環境によらず同じデバッグができます。特にマルチスレッド関係のデバッグは端末によっておきたり起きなかったりが発生するため、大変有用だと思います。

リモート環境でのデバッグ情報も保存して共有できるので、特にクラウド環境とかのデバッグ情報を共有するのは便利そうです。

そのほか

Kubernetisのコンテナーデバッグ、AzureやAWSでの.NET Coreアプリデバッグ、AWS Lambdaのデバッグなどもサポートしているようです。Lambdaで.NET Core使っている人はどうでしょう?

チュートリアル用のプロジェクトも公開されています。