次の行をC#に変換する際に問題が発生しました。
extern leveldb_filterpolicy_t* leveldb_filterpolicy_create(
void* state,
void (*destructor)(void*),
char* (*create_filter)(
void*,
const char* const* key_array, const size_t* key_length_array,
int num_keys,
size_t* filter_length),
unsigned char (*key_may_match)(
void*,
const char* key, size_t length,
const char* filter, size_t filter_length),
const char* (*name)(void*));
この関数はネイティブdllからエクスポートされ、C#から呼び出す必要があります。、、、はC#のデリゲートであることがわかっていますが、destructor
タイプによってcreate_filter
C #での表示につまずきました。私の主な質問は、これらをマーシャリングできるかどうかです。 MarshalAs属性を介した標準的なアプローチを使用した値、key_may_match
name
const char* const*
ちなみに、私は次のような単純な構成で問題はありませんでした。
public class Driver
{
static void Validate(string error)
{
if (!String.IsNullOrEmpty(error))
{
throw new ApplicationException(error);
}
}
public static extern leveldb_t leveldb_open(leveldb_options_t options, [param: MarshalAs(UnmanagedType.LPStr)] String name, out string error);
public static extern void leveldb_close(leveldb_t db);
public static extern void leveldb_put(leveldb_t db, leveldb_writeoptions_t options, byte[] key, size_t keylen, byte[] val, size_t vallen, out string error);
public static extern void leveldb_delete(leveldb_t db, leveldb_writeoptions_t options, byte[] key, size_t keylen, out string error);
public static extern void leveldb_write(leveldb_t db, leveldb_writeoptions_t options, leveldb_writebatch_t batch, out string error);
// Returns NULL if not found. A malloc()ed array otherwise. Stores the length of the array in *vallen.
[return: MarshalAs(UnmanagedType.LPArray, SizeParamIndex=4)]
public static extern byte[] leveldb_get(leveldb_t db, leveldb_readoptions_t options, byte[] key, size_t keylen, out size_t vallen, out string error);
public static extern leveldb_iterator_t leveldb_create_iterator(leveldb_t db, leveldb_readoptions_t options);
public static extern leveldb_snapshot_t leveldb_create_snapshot(leveldb_t db);
public static extern void leveldb_release_snapshot(leveldb_t db, leveldb_snapshot_t snapshot);
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern String leveldb_property_value(leveldb_t db, [param: MarshalAs(UnmanagedType.LPStr)] String propname); // Returns NULL if property name is unknown. Else returns a pointer to a malloc()-ed null-terminated value.
...
}