managedとunmanagedでまたハマる

実行時に突然、MarshalDirectiveExceptionという例外が発生し「パラメータ#1 を修正できません。このクラスの型の定義にレイアウト情報がありません。」というメッセージが表示されました。しかし、まったく意味がわかりません。MSDNでこの例外クラスのところを見ても、大した情報があるわけでもなく、、、。
とりあえず、色々とデバッカで追ってみたところmanagedクラスの中で関数ポインタを受け渡しをしていたのがまずかったようです。後から考えてみれば確かにそりゃまずいなとは分かるのですが、なんでコンパイル時に検出できないのかなぁ、と考えてしまいました。
結局、C++で __delegateを宣言してあげてそれを使うことで解決できました。
しかし、C#でもunsafeって書けばnativeのポインタを扱えるんですね。つい先日、それを知ったのですがヘッダファイルのincludeとかできるのかなぁ?と疑問がいくつかありつつ、まずはC++でmanagedコードの書き方に慣れなきゃと言ったところです。