C

C++→C(DLL)→C#(クラスライブラリ) の続き

PC C

id:lord_hollow:20100712:p1 の続き。 ネイティブアプリから、C#で実装した何らかの機能を呼び出すにはどうすればいいのか、という話。 前回書いた方法では、呼び出し元になるexeと、仲介役になるDLL(C++/CLI)と、そして機能を実装するDLL(C#)という三つのフ…

C#::partial

PC C

対象性を持つ二つのクラスを実装するときにpartialを使う、という実装を見かけた。 なるほど、なるほど・・・。

C#::lockステートメントについて

PC C

lockステートメントの内容物としてthis、Typeのインスタンス、文字列リテラルは指定してはいけないことになっています。http://msdn.microsoft.com/ja-jp/library/c5kehkcz%28v=vs.80%29.aspxそのリソースを扱うクラス(通常はひとつのはず!)以外がアクセ…

C#::XmlSerializer::デフォルト値のとき出力を省略

PC C

デフォルト値(0とか)が入っているプロパティをシリアライズしないようにするには、System.ComponentModel.DefaultValueAttribute属性で規定値を定義する。 [XmlType("entry")] public class Entry { /// <summary>オーダー</summary> [XmlAttribute("order")] [System.Component…

C#::タプルと匿名クラス

PC C

タプル var tuple1 = new Tuple<int, int>(0, 1); var tuple2 = Tuple.Create(0, 1); Console.WriteLine(tuple1.Item1); 匿名クラス var anon = new { v1 = 1, v2 = 2 }; Console.WriteLine(anon.v1); タプルのいいところ=関数の引数や戻り値に渡せる 匿名クラスのい</int,>…

C#::タプルと匿名クラス

PC C

タプル var tuple1 = new Tuple<int, int>(0, 1); var tuple2 = Tuple.Create(0, 1); Console.WriteLine(tuple1.Item1); 匿名クラス var anon = new { v1 = 1, v2 = 2 }; Console.WriteLine(anon.v1); タプルのいいところ=関数の引数や戻り値に渡せる 匿名クラスのい</int,>…

C#::二つのコレクションを同時にforeach

PC C

二つのコレクションに値が入っていて、それの同一インデックスに対する処理を行うときにひとつのforeachでやってしまおうという魔術。単純には、forを二重にして回してインデクサでコレクションから値をとってくればいいんだけど、以下の場合にとても役立ち…

C#::y以下であることを判定するためのラムダ式ってかわいいね

PC C

var d = l.Where(x => x <= y); どうだ、かわいいだろう(ドヤァ

C#::XML

PC C

XMLでデータをやり取りするとき、C#側のアプリはXMLSerializer使えば楽だよね!という話を以前(id:lord_hollow:20091203#p1)書いたけれども、「狙ったXMLを出力するクラス構成を一発で書いてやるぜ!」と息巻いてコードを書いたのに間違ってしまって悔しかっ…

Win32::パスの結合

PC C

Win32シェルAPIであるPathCombineの説明が怪しかったのでいろいろ入れて確認してみたよ http://msdn.microsoft.com/en-us/library/windows/desktop/bb773571.aspx The directory path should be in the form of A:,B:, ..., Z:. The file path should be in …

お前か!!

PC C

他の誰かがexe用に作ったソースコードを加工してDLLを作ってそれを使ってたんですけどね、たまにLoadLibraryで「メモリが足りません」というエラーが出ることがあったんですよ。 出たり出なかったりはまちまちだし、出なかったとき(ちゃんと読み込めたとき)…

このコマンドを実行するのに十分な記憶域がありません。

PC C

仕事で書いてるプログラムで、LoadLibraryを呼び出すと失敗してエラーコード8(ERROR_NOT_ENOUGH_MEMORY:このコマンドを実行するのに十分な記憶域がありません。)が返ってくることがある。 この現象がさっぱり理解できない。傾向としては確かにメモリ使用量が…

混合モードデバッグ

PC C

id:lord_hollow:20100712:p1の続き。おっと、おおよそ一年前のネタなのか。あと一週間寝かせておけば丁度良かったかな?(何がだ) ネイティブアプリからマネージドな実装を古の方法で呼び出す、という内容の話で、その中に「(マネージド部分の)デバッグがで…

C#::スクリプト言語としてのC#

PC C

C++からC++/CLIを経由してC#をスクリプト言語として使おうとしている俺。http://labs.yaneu.com/20101017/このエントリが出てきたときは「ふーん、興味ないね!」とスルーしていたんだけど、まさか仕事でお世話になる日が来ようとは。

C#::全力でBeginInvokeするとどうなる?

PC C

答)死にます。その技は【秘技・三年殺し】と呼ばれています

C#::ビットマップの全体をクリアするのにかかる時間

PC C

いろんなコードの処理時間を計測したら日記にメモするのが確実だという気がするので、ビットマップ全体の塗りつぶしにかかる時間を計測。

C#::列挙型(enum)にインスタンスメソッドをつけるよ!!

PC C

C#3.0(VS2008)以降にする 拡張メソッドを定義する 以上。

C#::XmlTextAttribute

PC C

XmlTextAttributeについて、MSDNには「XmlNode を返すフィールドや、XmlNode オブジェクトの配列を返すフィールドにも適用できます。」と書いてあるのだけど、いざXmlNode型のフィールドにXmlTextをくっつけて動かしてみたら例外になった。 よく読んでみると…

C#::ListBoxのオーナードロー(OwnerDrawVariable)時のサイズ再計算

PC C

System.Windows.Forms.ListBoxにはオーナードローの設定があって、それを使うと項目ごとに高さの違うリストとして表示できるようになる(DrawMode=DrawMode.OwnerDrawVariable)。つまり、長いカラムを折り返して表示したりできるようになるんだよ!!だがしか…

C#::DirectShow

PC C

他に書くこともないし、なんかメモ書きが出てきたのでアップ。 こないだ(id:lord_hollow:20091011:p2)紹介したデスクトップマスコットアプリで使っている、DirectShowに関する覚書。 DirectShowはストリーミングのソース(AVIファイルとかUSBカメラとか)か…

C#4.0

PC C

仕事で.Net4.0環境を使うことになりそうな気配だったのでちょっと調べてみた。 とはいえ仕事で使う範囲では実は.Net3.5環境で十分なのだけど、開発環境は4.0になりそうなので4.0について知っておけばアドバンテージあるだろ?.Net3.5になったとき(というかC#…

C#::大量のデータをグラフ化したいと思います

PC C

Excel2003では表示しきれないような大量のCSVデータがあったので、SQLiteに突っ込んでNPlotでグラフ化してみたよ、という話。 使うものはVC#2008(Express), System.Data.SQLite, NPlot。 NPlotいいよ。軸ドラッグしてスケールを変えられたりするしね。本題は…

クラス設計の話

PC C

id:daisuke-m:20100714:1279119661 を見ていい機会だと勝手に思ったのでクラスインターフェースの設計について書くよ。 クラスのインターフェース(使い方)は「バランス」だとか「使い勝手」だとかいう怪しげなものを基準にして決めるべきではなくて、クラ…

C++→C(DLL)→C#(クラスライブラリ)

PC C

C++のアプリから伝統的なC言語DLL(__declspec(dllexport))を呼び出したら実はそいつがC++/CLIで作られていて、そこからC#で作ったクラスライブラリを呼ぶぜ!みたいなパターン。 わかりやすく言えば、SusieプラグインをC#で作りたい、とかそんな話だよ!わか…

C#::足し算ができません

PC C

実はC#には8bitや16bitの足し算がないらしい。 Int16 add(Int16 x, Int16 y){ return x + y; } このコードがコンパイルエラー。対策は、演算自体は暗黙的なキャストで桁上げされるので戻り値をキャストすればOK、なんだけど・・・ Int16 add(Int16 x, Int1…

C++::utf-8なファイルの読み込み

PC C

なんかBoost使わなきゃならないとかいろいろあったのだけど、結局windows限定ならばfopen_sを使えばいいという結論に。 FILE *f; errno_t err = fopen_s(&f, "UTF8file.txt", "rt,ccs=UTF-8") ; if (err != 0) return false; wchar_t buf[BUF_SZ]; wstring s…

C#::ペースト禁止!

PC C

コントロールへの貼り付けを禁止する(メールアドレスの入力確認欄とか?)には、WM_PASTEを引っ掛けて何もしなければ良いです。つまり、 public class PasteDisabledTextBox : TextBox { const int WM_PASTE = 0x0302; protected override void WndProc(ref Me…

C#::イベントハンドラ

PC C

VisualStudio2008(C#3.0)になってからラムダ式が使えて、こいつがイベントハンドラの記述にとてつもなく便利。 特にフォーム関連のイベントとかだと、IDEによるイベントの設定とか一々してられない。各ハンドラの中身は概ね1行(ロジック用メソッドの呼び出…

C#::XmlSerialzierでStringをデシリアライズすると空白が消えてしまうんですけど!

PC C

XMLの仕様です。属性値でない普通の文字列は、全改行を空白変換し、二つ以上続く場合は一つに纏められます。 これに対処する方法は二つ。XmlSerialzierでデシリアライズするときに空白をそのまま読み込むように設定すること。より具体的には、Deserializeに…

C#::スレッドの終了に処理を引っ掛ける

PC C

重たい処理をスレッドで実行しておいて、それが終わったら何かする。スレッドの用途としては良くあるパターン。 普通に考えたら、「思い処理をやって何かする」関数を作ってそれをスレッドとして実行するわけだけど、「何かする」の部分がそこ以外にも需要の…