ITエンジニア向け 情報館  
   

 

.NET 一般

.NETフレームワークの使い方、ライブラリなど

ストリームの内容を別のストリームにコピーする

あるストリームから読み出したデータを、別のストリームに書き込む処理が、.NET4から1つのメソッドで簡単に行えるようになりました。
StreamクラスのCopyToメソッドを使えばよいとのことです。

私はストリーム間のデータ転送処理を書くことも多いので、この方法でちょっとは楽になりそうです。

【参考】ストリームを簡単にコピーするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/1047streamcopyto/streamcopyto.html

ZIPファイルを扱う

DotNetZipというライブラリを使えば、ZIPファイルを扱うプログラムをかける。
http://d.hatena.ne.jp/griefworker/20090422/1240352630

IISを操作する

C#のコードから、IISを操作するサンプルコードとその方法が紹介されています。
http://gushwell.ldblog.jp/archives/52049444.html

microsoft.web.administration.dllを参照設定することによって利用できるらしいですが、IIS7に付属しているようです。

具体的なサンプルコードが、MSDNにもあります。
http://technet.microsoft.com/ja-jp/library/ee175755.aspx

RFC非準拠のメールアドレスの扱い

.NET4では、RFCに準拠しないメールアドレス(ピリオドが連続しているメールアドレスなど)が扱えるようになっています。
対象は、MailAddressクラスです。
.NET 3.5までは、MailAddressクラスにRFCに準拠しないアドレスを指定すると例外が出ましたが、.NET4では例外が出ることなく扱え、メール送信まで行うことができるようです。
http://msdn.microsoft.com/ja-jp/library/system.net.mail.mailaddress.aspx

現在実行中のメソッド名と、クラス名を取得する方法

MethodBaseクラスのGetCurrentMethodメソッドを呼び出すことで、現在実行中のメソッド名を取得することができます。
http://msdn.microsoft.com/ja-jp/library/system.reflection.methodbase.getcurrentmethod.aspx

戻り値はMethodBaseクラスであるため、さらに以下のコードで、どのクラスのどのメソッドを実行中かも取得できます。
MethodBase.GetCurrentMethod().DeclaringType.FullName;

これを応用すれば、実行中のメソッド名などを容易にログに記録できます。
ソース中にメソッド名をべた書きしていると、メソッド名のリファクタリングを行ったときにも容易に対応できます。

CSVファイルの仕様

RFCで、CSVファイルの書式仕様について規定がある。
http://www.ietf.org/rfc/rfc4180.txt

Excelのソフトもこの仕様に沿ったフォーマットで、CSVファイルの読み込み、書き出しができます。
また、この仕様に沿って.NETアプリケーションを作る場合は、Microsoft.VisualBasic.FileIO.TextFieldParserクラスを利用すると便利です。

単体テストを複数のCPUコアで並列実行する方法

VisualStudio2010に単体テスト機能がありますが、複数のCPUコアを使って複数の単体テストを同時に並列実行する方法が書かれています。
http://blogs.msdn.com/b/kkondo/archive/2010/12/06/unittestmulticore.aspx?wa=wsignin1.0

単体テストでのHttpContextクラスの挙動

単体テスト実行中のHttpContextは、テストメソッドごとに初期化される。
そのため、[TestInitialize]のメソッドで、毎回HttpContextを初期化するロジックを入れるとよい。

HTML Agility Pack

HTMLのソースを解析し、タグの要素を抽出できるライブラリです。
http://blogs.itmedia.co.jp/tamaki/2011/04/html-agility-pa-767a.html

IMEで入力された日本語の読みを取得

http://www.atmarkit.co.jp/fdotnet/dotnettips/875imeyomi/imeyomi.html

IDisposableの実装

http://gushwell.ldblog.jp/archives/51931181.html

正規表現

パスワードとして次の要件を必要とする場合、

  • パスワードを8文字以上
  • 半角英数字以外に、キーボードから入力できる記号も許容

これを表した正規表現は次の通り。

[\w!"#$%&'()=\-~^|\\`@{[+;*:}\]<,>\.?/_]{8,}

.NETで簡単に月末の日付を求める方法

【月初/月末の日付を求めるには?[C#、VB]】

こちらのサイトにある記事で、ある月の日数(例:1月なら31、10月なら30)を求めるメソッドが、.NETで標準で用意されていることを知りました。長年.NETやってますが、これは知らなかった。
自分が負けたような気分で、悔しいです(笑)

これまで仕事上、いろんな人たちが、月末の日付を求めるオリジナルなロジックを作り込んでいる現場をたくさん見てきました。
正確に月末の日付を計算できないロジックもいろいろ見てきましたが、今後はこれを使ってもらうよう指導すれば、無駄な開発工数を削減できそうです。

かゆいところに手が届くメソッドが、意外と.NETにはたくさんあるものですね。

HttpClientクラスでHTMLをダウンロード時、応答がなくなった場合の対処法

.NET4.5で登場した、HttpClientクラスはとても便利です。
以前はWebClientやHttpResponse/HttpRequestクラスなどを使っていましたが、それよりも格段に使い勝手がよくなっています。

ただ注意点もあります。HttpClientクラスでは非同期によるダウンロードメソッドが用意されていますが、場合によってはスレッドデッドロックが発生し、結果が返らない状態が永遠に続く、という現象に陥ることがあります。
さらに、タイムアウトを設定しても、非同期呼び出しだとタイムアウト機能が無効化されるのです。
そのため、ダウンロードメソッド呼び出し後に、結果が返ってこない、反応がない、固まった、という現象に見舞われることもあります。

私もその現象が発生しましたが、ConfigureAwaitメソッドを呼び出して解決することができました。
詳しくは、下記のサイトをご覧ください。

※「スレッド デッドロック ConfigureAwait」で検索すれば、いろいろな情報が得られます。

コレクションクラスの処理速度比較(オーダー比較)

以下は、MSDNのサイトよりまとめたもの。

クラス List<T> Collection<T>
内部実装 配列 配列
Add O(1)またはO(n) O(1)
Count O(1) O(1)
Contains

O(n)

O(n)
Item O(1) O(1)
Remove O(n) O(n)

 

クラス Dictionary
<T>
SortedList<T> Sorted
Dictionary<T>
内部実装 ハッシュテーブル ソート済み配列 二分木
Add O(1)またはO(n) O(n) O(logn)
Count O(1) O(1) O(1)
ContainsKey O(1)に近い O(logn) O(logn)
ContainsValue O(n) O(n) O(n)
Item O(1)に近い 取得はO(logn)
設定はO(n)
O(logn)
Keys O(1) O(1) O(1)
Remove O(1)に近い O(n) O(logn)
TryGetValue O(1) O(logn) O(logn)
Values O(1) O(1) O(1)

 

アプリケーションアーキテクチャ

「アプリケーションアーキテクチャガイド」のページへのリンク
http://msdn.microsoft.com/ja-jp/architecture/gg998968

ClickOnce

ClickOnceのちょっとしたワンポイントテクニックについて書かれています。
http://blogs.msdn.com/tsmatsuz/archive/2006/08/16/701993.aspx

ADO.NET

自動トランザクションが機能しない問題

ADO.NETで自動トランザクションを効かせたプログラムコード(TransactionScopeクラスを用いたコード)を書いても、自動トランザクションが働かない場合がありました。

調査したところ、接続文字列にenlist=falseが指定されていました。
これが指定されると、トランザクションに参加しない設定になるようです。
詳細は、検索エンジンで「enlist false」などと入力すれば、さまざまな情報サイトが出てきます。

基本トランザクションマネージャとの通信が失敗しました。

このエラーメッセージが出た時、MSDTCの設定で「セキュリティ>トランザクションマネージャー通信>相互認証を必要とする」にチェックが入っていると、トランザクションの最中にエラーが出てDBアクセスに失敗することがあります。この項目で「認証を必要としない」に設定すると、正常にトランザクションが実行されます。

詳細は以下のページも参照のこと。
http://www.logistech.co.jp/techtips/msdtc.html

トランザクション処理の途中でのエラー

トランザクションの状態に対して操作が有効ではありません。
基になるプロバイダーが Open で失敗しました

このエラーメッセージが表示されるとき、TransactionScope.Completeメソッドの記述忘れがないか確認してみましょう。エラー発生個所の前の段階の処理を確認しましょう。このエラーは、ロールバックしたトランザクションに対して、DB処理を続けて行おうとしたときに発生します。
Completeメソッドを書き忘れていると、トランザクション処理の一部でロールバックが行われてしまいます。Completeを書き忘れている個所がないか、処理ロジックを確認してみましょう。

EntityFrameworkでSQL関数にマッピングされるCLRのメソッド

EntityFrameworkでSQL関数にマッピングされるCLRのメソッドの一覧が、下記にまとめられています。
これで、EntityFrameworkを使ったクエリ式に書けるメソッドを把握することができます。
http://msdn.microsoft.com/ja-jp/library/bb738681.aspx

EntityFrameworkでSQL文を直接実行する方法

下記URL参照。
http://mslaboratory.blog.eonet.jp/default/entity_framework/

IDENTITY列にInsertした時の値の取得方法

Entity FrameworkまたはSqlCommandを使って、IDENTITY 列を持ったテーブルに行を挿入した時の IDENTITY 列の値を取得する方法です。
http://code.msdn.microsoft.com/DataAccess-howto-383a3202/
http://code.msdn.microsoft.com/DataAccess-howto-b5a084df/

EntityFramework(CodeFirst)でdatetime2型のエラーが発生する原因と対応

http://kazenetu.exblog.jp/18969119

windowsサービス開発

効率よくWindowsサービスを開発・デバッグできるツール

.NETで開発したWindowsサービスを、簡単に動作確認、デバッグするためのツール「topshelf」がとても便利です。
詳しいことは「topshelf」で検索すれば、いろいろ出てきます。

UnicodeとシフトJISとで、文字の比較順序が異なる

二つの文字を、UnicodeとシフトJISとでそれぞれ文字コード順で比較したときに、結果は一般的に同じとは限りません。
例えば、Unicodeで比較したときあれば"本">"部"ですが、シフトJISで比較した場合は"本"<"部"となります。

逆に、文字コード順にソートされていることが分かっているが、どの文字コードでソートしているかが分からないとき、「本」「部」の2文字で比較すれば判断することが可能になります。
名づけて、「本部作戦」とでも呼ぶのがいいでしょうかね。

マルチスレッド処理

.NET4のマルチスレッド処理

.NET4では、System.Threading.Tasks名前空間にあるParallel.Invokeメソッドを使うことで、複数のメソッドを簡単にマルチスレッドで実行することができる。
ただし制限として、引数なし、戻り値voidのメソッドに限られる点に注意。

【参考】http://www.atmarkit.co.jp/fdotnet/csharp4/csharp4_02/csharp4_02_01.html

このページでは、CPUに存在するコア数を超えてマルチスレッド処理を行った場合、逆にパフォーマンスが下がることがあることも指摘している。これも合わせて参考になる。

さらに、.NETで稼動コンピュータのCPUコア数を知る方法もあるようです。
【参考】http://gurizuri0505.halfmoon.jp/20080806/2423
【参考】http://social.msdn.microsoft.com/Forums/ja-JP/netfxgeneralja/thread/eeed7149-6a36-4c64-a41f-5d93600e821a

これを併用すれば、搭載されているCPUコア数を元に最適なスレッド数で処理を実現するコードも書けそうです。

Visual Studio

Visual Studio 2015で「文字リテラルに文字が多すぎます」のビルドエラー

Visual Studio 2015にアップグレードしてソースコードをビルドしたときに、「文字リテラルに文字が多すぎます」というエラーメッセージが出た場合の対処法です。

文字型変数に、あきらかに誤った文字情報を入れているのでなければ、該当ソースコードの文字コードがSJISになってしまっていることがエラーの原因です。

メニューバーの、
  ファイル > 保存オプションの詳細設定
のメニューで、ソースコードの文字コードをUTF-8にして保存し直し、再度ビルドすれば、エラーメッセージは解消されます。

.NETアプリ内で発生した例外をいち早くキャッチする方法

アプリ内で発生した例外を一括して処理する仕組みが.NETにはあります。
詳しくは後述のURLを見ていただくとして。

AppDomainクラスに、FirstChanceExceptionイベントというエラー処理用のイベントがあることを、恥ずかしながら最近知りました。
.NET4.0から登場したそうです。

このイベントでは、catchできなかった例外だけでなく、そもそもcatchされる直前の時点で呼び出されるイベントです。
あらゆる例外を真っ先に検知できる仕組みと言えます。

例外処理の幅が広がる一方、FirstChanceException内で例外が発生すると無限ループに陥るなど、使いどころ・使い方にちょっと工夫が必要になるようですね。

【例外をまとめてトラップするには?】
http://www.atmarkit.co.jp/ait/articles/1512/16/news026.html

VisualStudio2015で、SQLServer2016に対してデータベース比較ツールが使えない場合の対処法

VisualStudio2015には、データベース比較ツールが付属しています。
このツールを使うと、2つのデータベースの定義を比較して、テーブル定義・列定義が一致しているかどうかを調べることができます。

先日、SQLServer2016のデータベースに対して比較をしようとした時、エラーが出て比較をすることができませんでした。
調べたところ、VisualStudio2015のUpdate3をインストールすれば、SQLServer2016にも対応できるようです。

VisualStudio2015 Update3をインストールしてみると、見事SQLServer2016のデータベースも比較することができるようになりました。

スタックトレースに行番号が表示されない場合の対処法

例外発生時に、スタックトレースに行番号が書かれていると、ソースコード中のどの箇所でエラーが発生したのかを迅速に把握でき、プログラムの改修をピンポイントで行えるようになります。
スタックトレースに行番号が表示されない場合は、次の原因が考えられます。

拡張子pdbファイルがない

実行環境に、pdbファイルを配置し忘れたなどの理由が考えられます。
pdbファイルを実行環境に配置すれば、行番号が表示されるはずです。

pdbファイルの対応付けが誤っている

pdbファイルはあるが、異なるビルドタイミングで生成した拡張子dllやexeのファイルと併存していることが考えられます。例えば、dllファイルは更新したが、pdbファイルを更新せず古いままだった、などが考えられます。
同じビルドタイミングで生成されたdllファイルとpdbファイルを、実行環境に配置すれば、行番号が表示されるはずです。

VisualStudioの設定

VisualStudioでのビルドの設定により、pdbファイルが生成されない設定になっていることが考えられます。
VisualStudioのプロジェクトのプロパティを開き、
設定項目:ビルド>詳細設定(D)>デバッグ情報
設定値:fullまたはpdb-only
と設定すれば、pdbファイルが生成されるようになります。

補足

本番稼働環境にはpdbファイルを置くな、という意見も多くあります。
ただ、本番環境で万が一不具合が発生した時に、的確に最速でバグを回収して本番環境を再更新が必要とされる要件がある場合には、pdbファイルを置いておくのも一考に値します。

 

 



Copyright 2004-2017 kiyochan. All right reserved
本サイト内で使用している文章や画像などの無断転載を禁止します


kiyochan.jp トップページに戻る