0

C++-CLI プロジェクトで C# クラスを使用しようとしていますが、Visual Studio では、C# オブジェクトへのハンドル (^) を関数内のローカル スコープでしか宣言できません。私がそれを機能させる唯一の方法は、ハンドルへのグローバルポインターを宣言することでした:

SUTAdapter::Form1^ *ptForm1;

しかし、関数内にオブジェクトを作成し、そのアドレスをグローバル ポインターに渡すと、次のようになります。

SUTAdapter::Form1^ form1;
form1 = gcnew SUTAdapter::Form1();
ptForm1 = &form1;
(*ptForm1)->incCounter(0);

関数が終了し、他の C++-CLI 関数内で incCounter 関数を使用しようとすると、オブジェクトがなくなったように見えます (デバッガーは this == null と表示します)。C++-CLI で C# コードのグローバル ハンドルを持つ方法はありますか? 何らかの理由でグローバルハンドルが禁止されていると思いますが、私にはアイデアがありません。これを行う必要があります。ありがとうございました。

編集:

*ptForm1 = gcnew SUTAdapter::Form1();

null 参照例外を発生させます。なんで?

4

5 に答える 5

4

この制限は、他の CLR ベースの言語と一致しているようです。たとえば、C# には静的で関数スコープの変数という概念がありません。C++/CLI にそのような機能がないことは、CLR がそのように機能することを示唆しています。つまり、静的オブジェクトはクラス スコープで定義する必要があります。

CLR はオブジェクト ベースであるため、これはオブジェクト指向の性質が CLR 上で実行される言語の設計に影響を与える一例に過ぎません。

OO の観点からは、とにかく C# の方が好きです。

于 2009-02-24T14:25:14.063 に答える
1
*ptForm1 = gcnew SUTAdapter::Form1();

null ポインターを逆参照しているため、null 参照例外が発生します。これは、その点で他の型へのポインターと同じです。

于 2009-02-24T14:08:57.957 に答える
1

あなたの答えに感謝しますが、私は最終的にそれを解決しました.グーグルで見つけました:

http://bytes.com/groups/net-vc/473036-how-define-global-com-object-vc-8-a

VS では、関数内でグローバル ハンドルまたは静的ハンドルを使用できないようです。管理対象オブジェクトにグローバルにアクセスする必要がある場合があるため、これについては困惑しています。

解決策は、静的ハンドルを内部に持つ「GlobalObjects」クラスを宣言することです。

ref class GlobalObjects
{
public:
static SUTAdapter::Form1^ hndForm1;
};

このようにして、C# フォーム/クラスにグローバルにアクセスできます。前のエラーのエラー コードは C3145 です。なぜ VS がグローバル ハンドルの宣言を許可しないのか疑問に思っています。

于 2009-02-24T14:03:07.610 に答える
1

Visual Studioでは、ローカル スコープで C# オブジェクトへの静的ハンドルを宣言できますか?

SUTAdapter::Form1^ theForm() {
   static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1();
   return form1;
}
于 2009-02-24T13:52:30.867 に答える
0

私はそれをテストせずに、あなたが抱えている問題は、ローカルハンドルへのポインタを格納しているためだと思います.自動オブジェクト。

上記の割り当てを置き換えようとしましたか


*ptForm1 = gcnew SUTAdapter::Form1();

ローカルオブジェクト参照による迂回の代わりに?

于 2009-02-24T13:32:06.297 に答える