2009-08-14 132 views
5

我有组件的一个有趣的堆栈我想把他们放在一起:C#和C++类的继承交织

  1. 通用组件(C#或C++ - CLI)

    public class MyBase 
    { 
    public void MethodA() 
    { ... } 
    private void MethodB() 
    { ... } 
    protected virtual MethodC() 
    { ... } 
    } 
    
  2. 测试代码组件(所有的C++ - CLI)

    public class MySpecific : public MyBase{ 
    protected: override MethodC(); 
    }; 
    
  3. 测试模拟器(C#)

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

虽然组件1可能是C++ - CLI让事情变得更简单,我真的很想保持组件3在C#。这在很大程度上是一个练习,以查看继承是否可以在任何一个方向上完成,但是我也有一个真实世界的情况,这个堆栈很有用。

我发现的第一个问题是,C++-CLI程序集不能编译,因为它不能将MyBase识别为一个类,尽管我有一个对程序集1的引用以及看起来像是正确的名称空间。

如何编写语言可移植的类?

回答

4

我认为你必须声明MySpecific因为这样的管理类:

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

详见CLI/C++文档。你将无法在不做修改的情况下使用旧的C++代码,但我认为你所想的一切都应该是可能的。

1

这样可以正常工作,但是如果您使用托管类型(即:从C#类继承),则需要使用C++/CLI语法。所以,在这种情况下,在第2项应该看起来更像:

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

确保文件使用/ clr编译非常。

这里是tutorial describing inheritance in C++/CLI

+1

如何让C++编译器查看MyBase?我一直得到“C2504:'Mybase':基类未定义” – Foozinator 2009-08-14 17:42:05

+0

确保将它添加为参考,并且您已使用/ clr编译此文件。另外,确保你正在使用(或使用)适当的命名空间。这听起来像你不在使用相同命名空间的部分。您可以完全限定MyBase - 即:公共ref类MySpecific:公共MyNamespace :: MyBase {...} – 2009-08-14 18:41:00

3

找到了答案:

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

也就是说,除了/ clr开关(需要被mananged C++的一侧)似乎是工作,那么远。