2

マネージ C++ とアンマネージ C++ の混在に関して、具体的な質問がいくつかあります。

  1. クラス/構造体の宣言を省略した場合、クラス/構造体は自動的にアンマネージになりますかref? それとも、ディレクティブとディレクティブvalueを含める必要がありますか?#pragma unmanaged#pragma managed
  2. アンマネージド型とマネージド型の互換性は? たとえば、マネージド クラスにアンマネージド オブジェクトを含めることができますよね? アンマネージ クラス/構造体をマネージ関数に渡す (つまり、std::string をマネージ関数に渡す) ことはできますか?

ご協力いただきありがとうございます、

アレックス

4

1 に答える 1

2

ハイブリッド型 (マネージド オブジェクトを含むネイティブ クラス、またはその逆) を持つことはできません。gcroot可能なことは、マネージド クラス内のネイティブ クラスへのポインターと、ネイティブ クラス内のテンプレートでラップされたマネージド ハンドルを持つことです。これは、ガベージ コレクターがネイティブ データを移動しようとしないようにするために必要です (これにより、純粋なネイティブ コードが保持するポインターが壊れてしまいます)。

マネージド型は、常にマネージド コードを使用して実装されます。マネージド型を呼び出す場合、ネイティブ型はマネージド コードを使用して実装する必要があります。

#pragma managed(push, off)コードを強制的にネイティブとしてコンパイルする方法です。これを行う理由はいくつかあります: C++ コンパイラによる最適化の改善、ガベージ コレクションによる中断の/clr:pure回避など/clr:safeそれは検証可能です。

マネージドとしてコンパイルされたすべてのコードは、ネイティブ型とマネージド型の両方を引数として受け入れ、値を返すことができます。また、そのコードは、マネージド型、ネイティブ型、またはフリー (グローバル) 関数内に配置できます。

于 2012-05-23T23:09:07.973 に答える