[C#]修正方法@「CA1060 P/InvokeをNativeMethodsクラスに移動します」

Win32API使ったらこんなコード分析エラーに阻まれた。

エラーメッセージに書いてあるとおりNativeMethodsクラスに移動することで解決する。

1
2
3
4
5
6
7
8
9
10
public class Sample
{
internal static class NativeMethods
{
[DllImport("user32.dll")]
public static extern int GetWindowRect(IntPtr hwnd, ref Rectangle lpRect);
}

/// あとは適当に NativeMethods.GetWindowRectを呼び出せば分析エラーは出ない
}

[C#] 修正方法@CA2232 Windows フォームのエントリ ポイントを STAThread に設定します

「STAThreadAttribute を使用してアセンブリ ‘minimalie.com.exe’ にエントリ ポイント メソッド ‘Sample.Main()’ を設定します。」

と言うような説明どおりに修正するだけ

1
2
3
4
5
6
7
8
9
public class Sample
{
// ↓ この属性を付ける!
[STAThread]
public static void Main()
{

// do something...
}
}

[C#] メソッドにmessageなどの名前の引数が含まれるとコード分析エラー(CA1303)出るときの対策方法

引数名に message, text, caption などの文字列を指定した場合は引数にリソースから取得した文字列を与えないと「CA1303 ローカライズされるパラメーターとしてリテラルを渡さない」というコード分析エラーが発生する。

コード内でローカライズしててもエラーが出る場合がある。そんな場合の対策としては…

続きを読む...

[C#]リソース(ResX)ファイルを実行時に動的に読みこむ

普通のリソース用のresxファイルにはプロパティのカスタムツールに ResXFileCodeGenerator が指定されているのでリソースを簡単に扱えるクラスが自動生成されるし、ローカライズも勝手にやってくれる。ただ動的にリソースファイルを切り替えて読み込んだりはできない。

自動生成されたコードに頼らずにResXファイルを実行時に読み込む方法

続きを読む...

[C#]一般的な例外に関するコード分析エラーの抑制方法

一般的な例外をむやみにキャッチするのはNGだけど、 キャッチするように言われたのでキャッチせざるを得ないことがあった。

そういう場合は以下の様な属性をつければコード分析エラーを抑制できる。 さすがにCA2201の抑制をすることはないだろうけど…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[SuppressMessage( // Exceptionなどの例外をメソッド外に送出する場合のエラー抑制
"Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")]
[SuppressMessage( // Exceptionなどの一般的な例外をキャッチする場合のエラー抑制
"Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
internal void ShowFailureMessageBox()
{

try
{
throw new Exception();
}
catch (Exception ex)
{
ex.ToString();
}
}

[Javascript] undefined な変数/引数/プロパティ/戻り値 と例外発生の愉快な挙動

挙動をまとめると

  • 変数を定義すれば undefined でも例外とばない(ローカル変数も同じ)
  • 関数の戻り値が undefined でも例外とばない
  • 未定義のグローバル変数へのアクセスは例外が飛ぶ
  • 未定義のプロパティにアクセスしても例外とばない
  • 未定義プロパティのプロパティへのアクセスは例外が飛ぶ
  • typeof を利用すると例外を飛ばさずに undefined かどうかを知ることが可能

続きを読む...

[C#] 読み取り専用のArray, List, Dictoinary

IReadOnlyList や IReadOnlyDictionary を実装したクラスを利用する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 配列から読み取り専用リストを作成
static readonly System.Collections.ObjectModel.ReadOnlyCollection<string>
Consts = Array.AsReadOnly(new string[]
{
"定数1",
"定数2",
"定数3",
});

// リストを読み取り専用リストに変換
static readonly System.Collections.ObjectModel.ReadOnlyCollection<int>
ConstList = new List<int>()
{
1,
2,
3,
}.AsReadOnly();

// リストから読み取り専用リストを生成
static readonly System.Collections.ObjectModel.ReadOnlyCollection<int>
ConstList2 = new System.Collections.ObjectModel.ReadOnlyCollection<int>(new List<int>()
{
1,
2,
3,
}.AsReadOnly());

// Dictionaryから読み取り専用Dictionary
static readonly System.Collections.ObjectModel.ReadOnlyDictionary<int, string>
ConstDictionary = new System.Collections.ObjectModel
.ReadOnlyDictionary<int, string>(new Dictionary<int, string>()
{
{1, "定数1"},
{2, "定数2"},
{3, "定数3"}
});

// かなり微妙な読み取り専用KeyValuePairリスト
static readonly System.Collections.ObjectModel.ReadOnlyCollection<KeyValuePair<int, string>>
ConstKeyValuePairs = new System.Collections.ObjectModel
.ReadOnlyCollection<KeyValuePair<int, string>>(new Dictionary<int, string>()
{
{1, "定数1"},
{2, "定数2"},
{3, "定数3"}
}.ToList().AsReadOnly());

※20151123 以前コードはreadonlyではなくconstになってました。コンパイル通らないですね。はい。

[C#]XmlDocumentのXMLパース時にWebExceptionが発生する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE plist PUBLIC ""-//Apple//DTD PLIST 1.0//EN""
""http://-/DTDs/PropertyList-1.0.dtd"">
<root></root>";


try
{
var xmlDocument = new XmlDocument();
// xmlDocument.XmlResolver = null;
xmlDocument.LoadXml(xml);
}
catch(WebException e)
{
Trace.Write(e.Message); // リモート名を解決できませんでした。: '-'
}

DTDに指定したURLにアクセスできない為WebExceptionが発生する。

これを回避するには XmlDocument#XmlResolver に null をセットする。 こうすることでDTDに指定したURLを解決しなくなる。

DTD解決が必要ならきちんとしたXmlResolerをセットして下さい。。