managed(push, off) の意味

このQ&Aのポイント
  • C#を勉強し始め、アンマネージド(ネイティブ・コード)のコードを書く必要があります。
  • マネージ・コードとネイティブ・コードの混在ということは理解できましたが、MSDNの「#pragma managed([push,] on | off)」の意味がよくわかりません。
  • 説明が載っているHPやその説明を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

managed(push, off) の意味

C#を勉強し始め、アンマネージド(ネイティブ・コード)のコードを書く必要があり C++での記述を調べています。 マネージ・コードとネイティブ・コードの混在ということは 「#pragma managed」「#pragma unmanaged」で使い分ける事は理解できたのですが MSDNにある #pragma managed([push,] on | off) #pragma managed(pop) の意味がよくわかりませんでした。 http://msdn.microsoft.com/ja-jp/library/0adb9zxe.aspx こちらに関して説明が乗っているHP、もしくはその説明を教えていただけないでしょうか。 よろしくお願いします。

  • fenri
  • お礼率50% (11/22)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19378)
回答No.2

#pragma managed(push, on) の意味は「今のマネージのオンオフの状態を取っておいて、マネージをオンにする」と言う意味。 #pragma managed(push, off) の意味は「今のマネージのオンオフの状態を取っておいて、マネージをオフにする」と言う意味。 #pragma managed(pop) の意味は「pushで取っておいたマネージの状態に戻す」と言う意味。 どこかのコードの途中で「マネージを一時的にオンしたい」とします。 一時的にオンにした後は「元の状態に戻す必要」があります。 そして、その場所の「元の状態がオンかオフか判らない」としたら、どうしたら良いでしょう? //サンプルコード1 //この位置はオンかオフか判らない // //マネージをオンにする #pragma managed // ~~~ ~~~ //マネージを元に戻す //#pragma managed/unmanagedのどっちか判らない!元に戻せない。どうしよう? // これでは、元に戻せませんね。 //サンプルコード2 //この位置はオンかオフか判らない // //今の状態を保存して、マネージをオンにする #pragma managed(push,on) // ~~~ ~~~ //マネージを元に戻す #pragma managed(pop) // どうです?元の状態がどっちか判らなくても「元の状態」に戻せたでしょう? managedのpushとpopは、通常「インクルードファイルの中で、マネージをオンしたりオフしたりする必要がある時」に使います。 例えば、test.hppのインクルードファイル内で //マネージをオンにする #pragma managed(push,on) // ~~~ ~~~ //マネージを元に戻す #pragma managed(pop) と書きます。 test.hppは「どこで使われるか判らない」ですから、マネージがオンの場所で呼び出されたり、マネージがオフの場所で呼び出されたりします。 インクルードを呼び出す側も //マネージをオンする #pragma managed // //このtest.hppは、中でマネージを一時的にオンにしても元に戻してくれる <#include test.hpp> // //ここは「マネージがオン」のつもりで書く // #pragma unmanaged // //このtest.hppは、中でマネージを一時的にオンにしても元に戻してくれる <#include test.hpp> // //ここは「マネージがオフ」のつもりで書く // みたいになっています。 もし、test.hppの中で「マネージをオンしたまま、元に戻さなかった」としたら、困った事になります。 // #pragma unmanaged // //このtest.hppは、中でマネージをオンにしたまま戻さないという、極悪非道なファイル <#include test.hpp> // //ここのコードを「マネージがオフ」のつもりで書いても、マネージはオンになっている // どうです?「元に戻す」ってのが、如何に重要な事か、理解できましたか?

fenri
質問者

お礼

理解できました! 大変丁寧に教えていただきありがとうございます!! 今の状態を意識しつつ、pushとpopをうまく使ってみたいと思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その下の例では不足ですか?

関連するQ&A

  • managed-C 使ってますか?

    唐突な質問で恐縮です。 私、制御系or技術計算系ソフトウェアをC/C++で開発しているものですが、.NET環境での開発にmanaged-C の利用が必要ということで、二の足を踏んでいます。 その理由としては、 1、計算速度が非常に重要なので、中間コードベースの.NETは遅い(?推測?) 2、unmanaged-C クラスをmanaged-C クラスに書き換えるのはすごく手間かかりそう 3、.NETの中でどんな処理されているのか見えにくいので、メンテがたいへんそう。 そこで、皆様の意見を伺いたいのですが、 managed-Cで開発されている方いらっしゃいましたら、どんなところがmanaged-C開発のメリットでしょうか? なんでもかまいませんので、お教えください。 よろしくお願いします。

  • マネージド コードとマネージド データとは?

    http://www.microsoft.com/japan/msdn/net/general/faq111700.asp#faq111700_term05 上のページで勉強したのですが、どうしても納得できないところがあります。 C++の場合、/clrスイッチをオンにすることでマネージドコードになるといってるのに、ガーベジコレクションを利用するには、さらに、/gcをクラスの前につけないといけないと書いてあるのでしょうか? マネージドコードはそもそもCLRのサービスをターゲットとして書かれたコードであり、CLRの機能であるガーベジコレクションが利用できないのなら、/clrスイッチをオンにしたC++のコードはマネージドコードとは言えないのではないでしょうか?

  • ネイティブからマネージドdllの呼び出し方法

    主題について、どなたかご教授願います。 主題の詳細として、ネイティブコード(Win32 アプリ C++)からマネージド(Visual studio C#)のDLLを呼び出したいと考えています。 一度、C#フォームアプリケーションにて、ダイアログ(フォーム)をもったアプリを作成し、アプリを作成したプロジェクトの出力をクラスライブラリに変更して.dllと.tlbを作成しました。 しかし、その後の呼び出し方法が不明なため、ネイティブコードからの呼び出し方法がわかっていない状態となっています。 つきましては、下記の質問について、どなたかお答えしていただけないでしょうか? 1:C#でのダイアログをもったDLLの作成は可能か(上記の作成方法が正確か否か) 2:上記が可能であれば、その作成方法 3:C++Win32 アプリケーションからの呼び出し方 サンプルや参考サイトなど、どんな情報でも構いませんので、ご教授のほど、よろしくお願い致します。

  • MSDNでVisualBasicコードを印刷には?

    WindowsXP, InternetExplore8でMicrosoftのMSDNのあるページの画面を印刷したいのですが、画面上には、VisualBasic、C#、VisualC++などいろいろなプログラムの言語のサンプルコードが表示されているのですが、[ファイル]メニューの[印刷プレビュー]で確認するとC#のサンプルコードだけしか表示されません。実際に[ファイル]メニューの[印刷]で印刷してみてもC#のサンプルコードだけしか印刷されません。 ここで、「C#のサンプルコードだけ」とは、全体の説明文と、C#のサンプルコードだけあり、他の言語のサンプルコードがないという意味です。 例えば、 http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.varenum.aspx のMSDNのページには、「VarEnum 列挙体」の説明が記載されていますが、VisualBasicのサンプルコード(説明文を含む)を印刷することはできるのでしょうか。 このページ上にある「言語フィルタ」や「印刷用ページ」なども試してみましたができませんでした。 よろしくお願いします。

  • マネージコードから呼び出したネイティブDLLの動作中のガーベジコレクシ

    マネージコードから呼び出したネイティブDLLの動作中のガーベジコレクション C++/CLIの勉強をしていますが、固定ポインタのところで疑問に思うことがあります。 手元の書籍では、ネイティブDLLを呼び出し中にガーベジコレクションが発生すると、 変数のポインタが変わるため、ポインタを固定にすると記されてありました。 ここの部分が疑問です。 ネイティブDLLの動作中は、中間言語は働かないので、 ガーベジコレクションも発生しない気がするのですが・・・。 ネイティブDLLでポインタを記憶した後に、マネージコードでガーベジコレクションが発生して、 記憶したポインタが無効になるのを防ぐというものなのでしょうか?

  • Javaの擬似構造体を利用したPushとPopについて

    現在、C++のコードをJavaに変換しているのですが、 Javaで構造体を扱うために、クラスを使って擬似構造体を構築し、 この内容をPushとPopで操作したいと考えています。 しかし、C++におけるポインタがJavaには提示されていないため、処理に困っています。 どのようにコーディングすれば、Javaで処理できるでしょうか? よろしくお願いします。 以下、C++のソースです。 //構造体配列の先頭にデータを追加する関数 void push(CPS_struct *cps , int *n) { int i; for (i = *n ; i >= 1 ; i--) { *(cps + i) = *(cps + i - 1); } (*n)++; }

  • [Err.Getexception] について

    とあるソースコードを読んでいるのですが、 その中の例外処理部分に If TypeOf Err.Getexception Is Oracle.DataAccess.Client.OracleException Then ~~~ End If という記述があるのですが、このコードの意味が分かりません。 このコードの意味することをどなたか教えていただけませんでしょうか。 すごく気になっています。 コードの意味を説明して下さる時には、下記(1)、(2)についても説明していただけると助かります。 (1)そもそもErr.Getexceptionが何を意味しているのか。  発生したエラーを表わす例外って何のことなんでしょうか。  (msdnのリファレンスを見ましたが全然わかりませんでした。) ↓msdn↓ http://msdn.microsoft.com/ja-jp/library/yk5ztsez(VS.80).aspx (2)Oracle.DataAccess.Client.OracleExceptionの意味 当方、プログラミングをほとんど素人同然です。 どなたかよろしくお願い致します。

  • 以下のソースコードについて

    #include<stdio.h> #include<stdlib.h> #include<string.h> int top, S[1000]; void push(int x) { S[++top] = x; } int pop() { top--; return S[top + 1]; } int main() { int a, b; top = 0; char s[100]; while (scanf_s("%s", s) != EOF) { if (s[0] == '+') { a = pop(); b = pop(); push(a + b); } else if (s[0] == '-') { b = pop(); a = pop(); push(a - b); } else if (s[0] == '*') { a = pop(); b = pop(); push(a*b); } else { push(atoi(s)); } } printf("%d\n", pop()); return 0; } このコードはプログラミングコンテストのためのアルゴリズムとデータ構造という本に 書かれていたコードで、項目はスタック構造に当たるものです。このコードを写してVIsual C++ に通したところ(バージョンは2015)エラーが発生しました。 どうしたらよいでしょうか 問題のURLはhttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A です。言語はCです。

  • C# Font GdiCharSet

    掲題の通り、C#のFontクラスが持つGdiCharSetプロパティについてですが、 これは一体どういったときに使われるものなのでしょうか? msdnに記載されている値を入れれば何か変わるかと思いましたが、 変化は見受けられませんでした。 https://msdn.microsoft.com/ja-jp/library/system.drawing.font.gdicharset(v=vs.110).aspx かなり情けない話ですが、この疑問に対するアプローチの仕方すらよくわからず、 闇雲に調べてみてはいるのですが、全然分かりません… 大変お手数ですが、お詳しい方、ご教授をお願いいたします。

  • .NET C++/CLIのガーベジコレクションについて

    .NET C++/CLIのガーベジコレクションについて .NET C++/CLIで、マネージピープの配列をネイティブDLLにポインタ引数として渡す動作で、 配列が正常に渡っていることは確認したのですが、ネイティブDLL側で配列の処理をしている最中に、 ガーベジコレクションが起こり、誤動作することはあるのでしょうか。 ちなみに、マーシャリングは以下のように行いました。 // マネージ側コード [DllImport("native.dll")] void ArraySet( [MarshalAs(UnmanagedType::LPArray)] array <int> ^ Data ); array <int> ^ Data = gcnew array <int>(64); ArraySet( Data ); // この中で配列の処理中にガーベジコレクションが起こると誤動作?