C#

Debugger Visualizerを自作する (Serializableではないクラスの場合)

C#

今回は System.Security.Cryptography.RijndaelManaged に対するDebugger Visualizerを自作することを考えます。暗号化・復号化に必要なIVとKeyのバイト列の値を16進数表記で表示させるという特に面白くもなんともないサンプルです。このクラスはSerializabl…

Debugger Visualizerを自作する

C#

Visual Studio では、ブレークポイントで止めた時に以下の図のように変数の中身を視覚的に見ることができます。ここで見られるのは普通は数値や文字列ぐらいに限られます。しかし例えばUriクラスならば、そのUriの示す先のWebページが見られたりしたら、(実…

はてなのCAPTCHAのクラック

今度研究室でOpenCV勉強会というのをすることになったのですが、そのネタにと思い、id:yaneurao:20090802 を参考にはてなの画像認証をクラックしてみました。CAPTCHAの画像をHTMLを解析して自動収集するところから書き始めたりして、全然30分では終わらず3時…

Parallel.Forの2重ループから脱出

C#

通常のforであれば、このような場合にはgotoが未だに健在です。しかし、以下のコードは、まあいかにもダメそうですがやはりコンパイルできません。delegateを作った時点ではラベルが認識されていないようです。 Parallel.For(0, 20, delegate(int i) { for (…

mono対応に書き換え中

またまた内部仕様が変わりまくりです。既にコア部分の対応は大体終わっていて、windows版のmono2.4では動作を確認できました。残るはMLやBlobの部分で、この辺りはC++/CLIで実装してあるので、これを全部やめてC#で書き直さなければなりません。しかし、ここ…

ポインタからfloat,doubleの値を読み取る

C#

ポインタから値を読み取るメソッドとして、Marshal.ReadByte, Marshal.ReadInt16, Marshal.ReadInt32, Marshal.ReadInt64 があります。すなわち、byte, short, int, long についてはこれらのメソッドを使うことで、unsafeを使うこと無くポインタの実体の値を…

System.Drawing.Bitmap を System.Windows.Media.Imaging.BitmapSource に変換する

名前空間が長すぎてうんざりしますが、つまりGDI+のBitmapから、WPFのBitmapSourceに変換しようということです。 using System.Drawing; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows…

メンバに配列を持つ構造体のマーシャリング

C#

コメントにご質問があったので、少し長くなりそうなのでこちらで書かせてもらいます。構造体とポインタ(若しくはバイト配列)との相互変換を行う方法については以前紹介しましたが、あの時の例はあえてごく簡単な構造体にしてありました。今回はメンバとし…

アンマネージ関数にdelegateを渡すと落ちるのは解決

delegateとかアンマネージとかあまり関係有りませんでした、すみません。Releaseモードだとオブジェクトの生存期間が変わってしまうのが原因でした。基本的には以下のページと同様の現象です。http://blogs.wankuma.com/shuujin/archive/2007/05/15/76794.as…

アンマネージ関数にdelegateを渡すと落ちる

前回の記事の件で訂正。もう少し探っていくと、2重のdelegateでなくとも単にアンマネージ関数に空のdelegateを渡すだけでも落ちていました。お手上げ状態なのは相変わらずです。GCが発動すると落ちるということしかわかっていません。そのアンマネージ関数と…

アンマネージ関数に渡したdelegateの中で、さらにアンマネージ関数にdelegateを渡すと落ちる

言葉では説明しにくいので、すごく端折ったコードで書くとこんな感じです。即席で書いているので間違っていたらすみません。C++側の実装 (hoge.dll) typedef void (_cdecl *CallbackA)(void); typedef int (_cdecl *CallbackB)(int a, int b); extern "C" __…

ポインタ(バイト配列)から構造体への変換

C#

前回の記事の逆変換の場合を考えていきます。基本的に、ポインタに変換するよりはコーディングは楽です。

構造体からポインタ(バイト配列)への変換

C#

色々方法はあります。これから、思いついたものを列挙していきます。

ヌルポインタ

C#使っているくせにポインタが絡むことばかりやっていて、なんだかなあと思う今日この頃。 C# unsafeコード中でのヌルポインタについて。C/C++では、NULLすなわち0という整数値をそのままポインタ変数に代入できましたが、C#は型にうるさいのでできません。…

基底クラスの基底クラスにアクセスしたい

C#

C#では base というキーワードで継承元のクラスのメンバにアクセスできます。では継承元の元はどうするか、つまり base.base.Hoge(); のようなことがやりたいという場合のお話です。しかし残念ながらbaseは繋げて書けません。

msvcr90.dll

C#で作ったDLLからC++/CLIで作ったDLLを呼び出すと、FileNotFoundExceptionが発生して、このところ途方にくれていました。 FileNotFoundExceptionというと、読み込むテキストファイルや画像ファイル等がないときに発生するというイメージでしたが、これはDLL…

多重ポインタの実体を得る

C#

あるIntPtrの変数ppに、構造体Tのポインタのポインタ、つまりC言語でいうところのT**が入っていたとします。このポインタからunsafeを使わずに実体の値を得る方法です。 確認までに、C言語ではこうなります (ppの型はT**とする)。 T t = **pp; C#(というか.…

ジェネリック関数の返り値

C#

以下のコードはコンパイルが通りません。doubleはstructですし、ifの中はTがdoubleの時しか絶対に実行されないので良さそうなものですが、ダメです。 T Hoge<T>() where T : struct { if(typeof(T) == typeof(double)) { double r2 = 1.41421; return r2; } els</t>…

XMLドキュメントコメントを多言語で書きたい

C#

のですが、いい方法はないものか・・・・。 とかのタグにlang="ja"とかあったらなあと思いましたがあるわけもなく。 思いついたのはこんな方法です。 #if LANG_JP /// /// 日本語 /// /// 正の数 #elif LANG_DE /// /// Deutsch /// /// eine positive Zahl …

ラッパーのメモリ管理

C#

C#でC/C++のライブラリのラッパークラスを作るときの基本形は、こんな感じになると思います。 class HogeWrapper : IDisposable { IntPtr ptr; public HogeWrapper() { ptr = createHoge(); } public void Dispose() { releaseHoge(ptr); } [DllImport("hoge…

ポインタの加減算・マネージ配列のポインタ取得

C#

※追記:.NET Framework4以降における方法 http://schima.hatenablog.com/entry/2013/10/08/003445現在OpenCvSharpをC#メインで書き直し中です。C++/CLIに比べるとVisualStudioの支援が手厚く、コンパイルも圧倒的に速いので作業効率は良いです。しかしラッパ…

納得いかないこと

最近プログラムを書いていてちょっと納得いかなかったことをいくつか。

FindContoursを実装

CvSeqを使う関数は何かとラッパー的に面倒なので避け気味なのですが、頑張って実装しました。最近たまっていた分を含めてリリースしておきました。Sandcastleのバージョンを上げたので、以前よりもヘルプが見やすくなっていると思います。 以下の画像はOpenC…

アンマネージ関数の動的呼び出し

C#でアンマネージな関数を使いたければ、DllImportを使うのが常道です。しかし、定義の際に必ずstaticをつけることからもわかるように、静的な定義であり、プログラムの実行中に動的に関数名を決めてロード、といったことはできません。C/C++ではWin32APIのL…

動的配列

C C# C++

だいぶ前に書いたちょっとしたメモのせいで、このブログに「C/C++/C# 動的配列」といったキーワードで飛んでくる方が結構いるみたいです。大して書いてなくて申し訳ないので勉強兼ねてまとめときます。

ステレオマッチング (cvaux)

cvFindStereoCorrespondenceBM, cvFindStereoCorrespondenceGCのほかに、cvauxの方にもcvFindStereoCorrespondenceという関数があります。こちらもラップしてみました。 http://opencv.jp/opencv-1.1.0/document/opencvref_cvaux.html#decl_cvFindStereoCorr…

エピポーラ幾何、ステレオマッチングの実装

こちらのページの関数をすべてラップしました。まだリリースはしてません。 http://opencv.jp/opencv-1.1.0/document/opencvref_cv_epipolar.html cvFindStereoCorrespondenceBMとcvFindStereoCorrespondenceGCを試しに動かしてみました。先ほどのOpenCVリフ…

C++/CLIでの定数の定義

クラスのメンバに定数を、すなわちpublicでstaticでconstな値を定義するとします。C++的な考えでC++/CLIで定義してみるとこうなるでしょう。 public ref class Const abstract sealed { public: static const Int32 HOGE = 123; }; しかしこれをC#側から定義…

文字の全ての組み合わせの列挙

例えばパスワードに総当たり攻撃をかけるときには、文字のあらゆる組み合わせからなるパスワードを作ってみて攻撃することになります。どういうアルゴリズムで作れるのか興味を持ったので書いてみました。 こんなクラスを定義しておきます。いまいちスマート…

.NET Frameworkの例外一覧

例外を投げたいとき、「この場合だとどの例外を投げるのが適切なんだろう?」と悩むことが良くあります。すぐ出てくるのはArgumentException, ArgumentNullException, FileNotFoundExceptionぐらいで、他はパッと出てこないのでただのExceptionを投げて誤魔…