2009-08-14 9 views
5

J'ai une pile intéressante d'assemblées que je veux mettre en place:C# et C++ héritage de classe entremêlement

  1. Assemblée commune (C# ou C++ - CLI)

    public class MyBase 
    { 
    public void MethodA() 
    { ... } 
    private void MethodB() 
    { ... } 
    protected virtual MethodC() 
    { ... } 
    } 
    
  2. Test Code Assemblées (tous C++ - CLI)

    public class MySpecific : public MyBase{ 
    protected: override MethodC(); 
    }; 
    
  3. Simulator test (C#)

    MySpecific obj = new MySpecific(); 
    obj.MethodC(); 
    

Pendant le montage 1 pourrait être C++ - CLI pour garder les choses simples, je voudrais vraiment garder ensemble 3 en C#. C'est en grande partie un exercice pour voir si l'héritage pourrait être fait dans les deux sens, mais j'ai aussi un cas réel où cette pile est utile.

Le premier problème que je trouve est que l'assembly C++ -CLI ne compile pas car il ne reconnaît pas MyBase en tant que classe, même si j'ai une référence à l'assembly 1 et ce qui ressemble à l'espace de noms approprié.

Comment écrire des classes qui sont portables en langage?

Répondre

4

Je pense que vous devez déclarer MySpecific comme cette classe gérée comme:

public ref class MySpecific : public MyBase { ... } 

Voir la documentation CLI/C++ pour plus de détails. Vous ne pourrez pas utiliser le vieux code C++ sans modifications, mais je pense que tout ce que vous avez en tête devrait être possible.

1

Cela fonctionnera correctement, mais vous devrez utiliser la syntaxe C++/CLI, si vous travaillez avec des types gérés (c'est-à-dire: hériter d'une classe C#). Donc, dans ce cas, l'élément en 2. devrait ressembler davantage:

public ref class MySpecific : public MyBase { ... } 

Assurez-vous que le fichier est compilé avec/clr sont bien. Il s'agit d'un tutorial describing inheritance in C++/CLI.

+1

Comment puis-je obtenir le compilateur C++ pour voir MyBase? Je continue à obtenir "C2504: 'Mybase': classe de base undefined" – Foozinator

+0

Assurez-vous qu'il est ajouté en tant que référence, et que vous avez ce fichier compilé avec/clr. Assurez-vous également que vous travaillez avec (ou utilisez) les espaces de noms appropriés. Il semble que vous ne soyez pas dans une section utilisant le même espace de noms. Vous pouvez qualifier complètement MyBase - ie: public ref class MySpecific: public MyNamespace :: MyBase {...} –

3

a trouvé la réponse:

`#using "..\common\bin\debug\common.dll"` 

Cela, en plus du commutateur/clr (C++ côté doit être mananged) semble fonctionner, jusqu'à présent.