2009-02-24 4 views
0

J'essaie d'utiliser une classe C# dans un projet C++ -CLI, mais Visual Studio me permet seulement de déclarer un handle (^) à un objet C# dans une portée locale, juste à l'intérieur d'une fonction. La seule façon je l'ai eu de travail a été déclaré un pointeur global à une poignée:Comment créer un handle global en C++ - CLI

SUTAdapter::Form1^ *ptForm1; 

Mais si je crée un objet dans une fonction et donner son adresse au pointeur global:

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

Lorsque la fonction se termine et j'essaie d'utiliser la fonction incCounter dans une autre fonction C++ - CLI, l'objet semble avoir disparu (le débogueur dit ceci == null). Existe-t-il un moyen d'avoir un handle global d'un code C# dans C++ - CLI? Je suppose que les poignées globales sont interdites pour une raison que je ne comprends pas, mais je n'ai pas d'idées et j'ai besoin de cela. Je vous remercie.

modifier:

*ptForm1 = gcnew SUTAdapter::Form1(); 

une exception Donne référence null. Pourquoi?

Répondre

0

Je pense - et c'est sans le tester - que le problème que vous avez est parce que vous stockez un pointeur vers un descripteur local, ce qui peut perturber un peu le garbage collector en raison du fait que vous prenez un pointeur vers un objet automatique.

Avez-vous essayé de remplacer l'affectation ci-dessus avec


*ptForm1 = gcnew SUTAdapter::Form1(); 

au lieu du détour par la référence d'objet local?

+0

Il déclenche une exception de référence nulle. – Hiperi0n

+0

Ah oui, maintenant que vous le mentionnez c'est assez évident. Je suppose que vous devrez l'initialiser avec une référence Form 1 en premier, mais encore une fois je n'ai pas essayé cela et vous semblez avoir trouvé la bonne solution de toute façon. –

1

Est-ce que Visual Studio vous permet de déclarer un handle statique à un objet C# dans une portée locale?

SUTAdapter::Form1^ theForm() { 
    static SUTAdapter::Form1^ form1 = gcnew SUTAdapter::Form1(); 
    return form1; 
} 
0

Ok merci pour vos réponses, mais je me suis finalement résolu, je trouvais googler:

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

Il semble que VS ne laisse pas de poignées globales ou poignées statiques à l'intérieur des fonctions. Je suis perplexe à ce sujet car il est parfois nécessaire d'accéder globalement aux objets gérés.

La solution est de déclarer une « GlobalObjects » classe avec poignées statiques à l'intérieur:

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

De cette façon, je peux accéder au formulaire C#/classe au niveau mondial. Le code d'erreur de l'erreur précédente est C3145, je me demande toujours pourquoi VS ne permet pas la déclaration des handles globaux.

1
*ptForm1 = gcnew SUTAdapter::Form1(); 

exception Donne une référence null parce que vous dereferncing un pointeur NULL - il est comme un pointeur vers un autre type à cet égard.

4

Cette restriction semble cohérente avec les autres langages basés sur CLR. C# n'a pas de concept de variable statique, à portée de fonction par exemple. L'absence d'une telle fonctionnalité dans C++/CLI suggère que c'est le fonctionnement du CLR - les objets statiques doivent être définis dans la portée de la classe.Le CLR est basé sur un objet, donc c'est juste un cas de cette nature orientée objet qui influence la conception des langages qui s'exécutent dessus. D'un point de vue OO, j'aime mieux le chemin C# quand même.

+0

Oui, avoir travaillé en C# et essayer de faire des choses de base en C++ peut être une vraie douleur. – Hiperi0n