くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2017年03月

C# .netMVCでGDI+のエラー

ちんまいWebアプリの中で、Drawingを使って画像を作ってる場所があるんだけど、最近そこの部分ではまった。

画像を保存するところで、唐突に「GDI+ で汎用エラーが発生しました。」で落ちることがある。発生するとIISResetするまで発生し続ける。ソース的には↓の感じ。

Bitmap img = new Bitmap(100, 64);
Color c = Color.FromArgb(0xFF, Color.FromArgb(Convert.ToInt32("0xD9333F", 16)));
Graphics g = Graphics.FromImage(img);
Pen pen = new Pen(c);
g.DrawLine(pen, 0, 0, 100, 0);
img.Save(".\HOGE\FUGA.png", ImageFormat.Png);//ここでエラー。

検索してみると、「ファイルパスがおかしいと落ちる」・「パスが長すぎると落ちる」・「ファイルから読み込んでそのまま保存とかしようとすると落ちる」・「フォルダの権限が足りないと落ちる」などなどいくつか出てくる。

ただ、↑くらいの話は結構誰でも知ってるポイントなので、何度も確認している。でも落ちる。

基本に立ち返り、MSDNを見てみると↓の事がかいてあった。

img01

・・・・・・ん!?

ASP.NET サービス内での使用はサポートされません。

使うなって事なのねん。何かが競合することでもあるんだろうかと愚考。

つか、.net4.0までは上の注意書きがないとゆー罠。4.5からサポートしなくなった模様。

なんか別のライブラリ的なサムシングエルスを使うしかあるまい。。。

2017/4/12追記 続き

MSDN

SQLServer クエリの実行プランのキャッシュをクリア

クエリのコンパイル結果のキャッシュをクリアする。

↓だけで動かせばキャッシュを丸ごと消す。

DBCC FREEPROCCACHE

クエリ特定して消す場合は↓。

--plan_handleの値を調べる
SELECT plan_handle, st.text  
FROM sys.dm_exec_cached_plans   
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st  
WHERE text LIKE N'%SELECT HOGEHOGE%';  --クエリの一部分を指定
GO  

--上で出てきたplan_handleの値を↓に入れて実行
DBCC FREEPROCCACHE ([plan_handleをコピペ])
GO

--こんな感じ⇒DBCC FREEPROCCACHE (0x06000900AA44913730D333A00000900001000000000000000000000000000000000000000000000000000000)

丸ごと消すと、プロシジャとかその他もろもろのキャッシュも消える。消えても問題は無いと思いますが、最初の実行時に多少時間かかるようになる。

参考はここ

問合せ