C# 和 C++ 类继承混合

发布于 2024-08-02 02:51:43 字数 644 浏览 2 评论 0原文

我想将一堆有趣的程序集放在一起:

  1. 通用程序集(C# 或 C++-CLI)

    公共类MyBase 
      { 
      公共无效方法A() 
      { ... } 
      私有无效方法B() 
      { ... } 
      受保护的虚拟方法C() 
      { ... } 
      } 
      
  2. 测试代码程序集(所有 C++-CLI)

    公共类 MySpecific :公共 MyBase{ 
      受保护:重写MethodC(); 
      }; 
      
  3. 测试模拟器 (C#)

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

虽然程序集 1 可以是 C++-CLI 以使事情更简单,但我真的很想将程序集 3 保留在 C# 中。 这主要是一个练习,看看是否可以在任一方向上完成继承,但我也有一个实际案例,该堆栈很有用。

我发现的第一个问题是 C++-CLI 程序集无法编译,因为它无法将 MyBase 识别为类,即使我引用了程序集 1 以及看起来正确的命名空间。

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

I have an interesting stack of assemblies I want to put together:

  1. Common Assembly (C# or C++-CLI)

    public class MyBase
    {
    public void MethodA()
    { ... }
    private void MethodB()
    { ... }
    protected virtual MethodC()
    { ... }
    }
    
  2. Test Code Assemblies (all C++-CLI)

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

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

While assembly 1 could be C++-CLI to keep things simpler, I'd really like to keep assembly 3 in C#. This is largely an exercise to see if inheritance could be done in either direction, but I also have a real-world case where this stack is useful.

The first problem I find is that the C++-CLI assembly does not compile because it doesn't recognize MyBase as a class, even though I have a reference to assembly 1 and what looks like the proper namespace.

How do I write classes that are language-portable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

吹泡泡o 2024-08-09 02:51:43

我认为您必须将 MySpecific 声明为托管类,如下所示:

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

有关详细信息,请参阅 CLI/C++ 文档。 如果不进行修改,您将无法使用旧的 C++ 代码,但我认为您想到的一切都应该是可能的。

I think you have to declare MySpecific as a managed class like this:

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

See the CLI/C++ documentation for details. You will not be able to use old C++ code without modifications, but I think everything you have in mind should be possible.

云归处 2024-08-09 02:51:43

找到答案:

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

到目前为止,除了 /clr 开关(C++ 端需要管理)之外似乎还有效。

Found the answer:

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

That, in addition to the /clr switch (the c++ side needs to be mananged) seems to be working, so far.

平生欢 2024-08-09 02:51:43

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

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

确保文件使用 /clr 编译良好。

这是描述 C++/CLI 继承的教程

This will work fine, but you'll need to use the C++/CLI syntax, if you're working with managed types (ie: inheriting from a C# class). So, in this case, the item in 2. should look more like:

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

Make sure that file is compiled with /clr are well.

Here is a tutorial describing inheritance in C++/CLI.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文