2009年10月15日木曜日

c# DLLImportする関数の引数にコールバック関数を渡す方法

基本コールバック関数はDelegateされたものを渡す。
そして渡すコールバック関数のポインタは、staticな領域もしくはClassで生成するdelegeteしたポインタを管理する事で実現できる。(ガベージコレクションにてポインタ回収されるのを防ぐ)

参照元:http://jp.rubyist.net/magazine/?0021-RubyWithCSharp#f05
----
private static List MethodDelegates = new List();

public delegate VALUE CallbackArg0(VALUE self);
[DllImport(RubyDll)]
private static extern void rb_define_method(VALUE klass, string name, CallbackArg0 func, int argc);
public static void rb_define_method(VALUE klass, string name, CallbackArg0 func)
{
MethodDelegates.Add(func);
rb_define_method(klass, name, func, 0);
}

// 使い方
Ruby.rb_define_method(rb_cString, "show_message", delegate(VALUE self)
{
MessageBox.Show(Ruby.StringValuePtr(self));
return Ruby.Qnil;
});

0 件のコメント:

Androider