2017-03-18 9 views
3

私が正しく覚えていれば、関数はCLR世界のクラスのメンバーでなければならず、C++/CLIではグローバル関数が可能です。これは、これらのグローバル関数が、ある種の隠れた「グローバル」クラスの一部であることを意味しますか?もしそうなら、反射目的のために、その型をどうやって得るのでしょうか?C++/CLIどのようなクラスがグローバル関数を囲んでいますか?

答えて

5

はい、.NETメタデータはグローバル関数と変数をサポートしています。 CLRソースコードでは「グローバルクラス」と呼ばれ、その名前は<Module>です。 C#vernacularを使用すると、クラスのインスタンスを決して作成できないように、internal,abstractおよびsealedになります。アングルブラケットは誤って重複するタイプの作成を防ぎます。

技術的には、BindingFlags.NonPublicとBindingFlags.Staticが必要です。それがどれほど実用的でないかを覚えておいてください。何かを見つけるために、mangled C++の名前を使用する必要があります。少なくともリンカの.mapファイルまたはildasm.exeのような逆アセンブラが必要です。それは非常に乱雑であることに注意してください、CRT識別子の多くは、典型的なC + +/CLIプロジェクトのためにこのクラスに終わります。バグのビット。

最後に、ほとんどの場合、コードは<Module>にあるのが間違いです。わかりにくいreverse-pinvokeの理由を除いて、常にマネージコードをrefクラスの中に入れてください。特にあなたはそれを反映したい場合。さらに気になるところでは、MSILにコンパイルされたネイティブのC++コードがあまりにも多くなってしまいます。これはうまくいくので、C++ 03に準拠したコードはMSILにコンパイルできるので、基本的にどちらの世界でも最悪の状態になっているとは言えません。 C++/CLIをネイティブのC++コードから厳密に分離することは重要です。スタティックライブラリプロジェクトを使用するのが最も簡単です。

4

実際には "<モジュール>"(角かっこ付き)という名前のクラスは、名前空間にはありません。このクラスは実際には通常のC#アセンブリに存在します。

関連する問題