Visual Studioでハマった時の覚書(随時追記)
何かにハマったら適宜更新していきたい。
本記事公開時の環境はVisual Studio2019。
- リソースが見つからない
- 具体的な例外をcatchしているのに「CA1031 一般的な例外の種類はキャッチしません」が消えない(2021/7/25追加)
- インストーラーの作成について(2021/7/26追加)
- 作成したクラスが構成を変更すると参照できない
リソースが見つからない
リソースファイルのプロパティにて下記2点を設定しないと参照できない。
久しぶりにやると大体これを忘れる。
- ビルドアクション:リソース
- 出力ディレクトリにコピー:新しい場合にコピーする or 常にコピーする
具体的な例外をcatchしているのに「CA1031 一般的な例外の種類はキャッチしません」が消えない(2021/7/25追加)
CA1031: 一般的な例外の種類はキャッチしません (コード分析) - .NET | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/quality-rules/ca1031
コード分析した時のInformationだったので無視することもできましたが気持ち悪いのでいろいろと試したところ、下記で消えました。
発生するコード例
try { File.AppendAllText($"{folder}{fileName}", outText); } catch (DirectoryNotFoundException) { ShowErrorMessage($"出力先のフォルダが見つかりませんでした。\n{folder}"); return false; }
修正後のコード
try { File.AppendAllText($"{folder}{fileName}", outText); } catch (DirectoryNotFoundException e) { ShowErrorMessage($"出力先のフォルダが見つかりませんでした。\n{folder}"); LogService.DumpException(e); // 自前のログ出力クラス。 return false; }
以下はコードの経緯と推測。
元々、Exceptionを直接catchしていた(どうせIO関連以外の例外なんてそうそう発生しないんだからあとできれいにしようという考えのもと仮実装していた)。
この時はWarnaingが出ていたのですが、アプリ全体の例外処理とログ出力処理を追加したところInformationに変わりました。
今回、仮実装したところを個別の例外をcatchするように変更したところ、Informationが消えないままでした。
全体の例外処理をハンドリングしてログ出力しているのにここではログ出力しないんか?例外の情報参照してないぞという気付きを促すものなのだと思います。
(もう少しわかりやすいメッセージにしてほしい。)
更に追記
試しにアプリ全体の例外処理を削除してもInformationのままでした……。警告じゃなくなったのは別要因だと思われます(上のコード修正で直るのは変わりない)。
インストーラーの作成について(2021/7/26追加)
Microsoft Visual Studio Installer Projectsを使用した場合の注意点。
NuGetで参照するdllのバージョンが下記のようになっている場合、ビルドした際とInstallerが自動で検出する際とでバージョン差違が発生する場合がある。
C:\Users\%USERNAME%\.nuget\packages\system.buffers\4.5.1\lib\net461
C:\Users\%USERNAME%\.nuget\packages\system.buffers\4.5.1\ref\net45
仕方がないのでbinフォルダに出力されたファイルを直接Setup対象ファイルとして追加することで回避。
ライブラリが増減するたびにメンテが必要なので注意。
作成したクラスが構成を変更すると参照できない
以下の手順を行うとクラスが参照できなくなる。
- クラスを作成する
- 作成したクラスを別のクラスから参照する
- 作成したクラスをリファクタリングで名前を変える
- 構成を変更する(Release→Buildなど)
一度、プロジェクトの参照から外して再追加すると参照できるようになる。
(リネーム前に両方の構成でビルドしておくと問題ないっぽい)
(これはバグでは???)