【问题标题】:Inheritance between clr project dllsclr项目dll之间的继承
【发布时间】:2018-05-20 21:19:21
【问题描述】:

我有一个用 c++/cli 编写的抽象基类。这个类位于一个项目中。我还有其他项目继承了抽象基类。所以,结构如下。

基础项目:

public ref class Base abstract
{
  // implementation
  virtual CommonFunc();
};
public delegate void Foo();

派生项目A:

public ref class A : public Base
{
  // implementation
};

派生项目B:

public ref class B : public Base
{
  // implementation
};

等等。我可以在 C# 项目中同时调用 A 和 B 类。没问题。

但是,当我尝试使用 Base 的 Foo 委托时,会出现如下错误;

错误:'Foo' 是 'Foo' 和 'Foo' 之间的模糊引用

摆脱这个。我在 C# 项目中为 A 和 B 的引用定义了外部别名。所以,当我像 AliasA.Foo 一样使用时,没关系。但是,在两个 A 和 B dll 中存在两个 Foo。这是个问题。

最后,当我尝试开发如下代码时,编译器不知道 AliasBase.Base 是 A 的基础。

AliasBase.Base base = new A();
base.CommonFunc();
base = new B();
base.CommonFunc();

错误:无法将类型“A”隐式转换为“Base”

我希望我说清楚了。总结;我有三个 dll。其中之一是基类的 dll,其他的是继承类的 dll。继承类的 dll 包含它们自己的基本实现。有没有办法摆脱基类的多个实现?

注意:是的,如果我将它们收集到一个项目中,就不会有问题。但是,我被要求为所有派生项目提供单独的 dll。

提前致谢。

【问题讨论】:

  • 这可能是您放在 .h 文件中并在其他源文件中#included 的代码。所以现在有多种 Base 和 Foo 的定义。而且 B 和 C 没有相同的 Base 类,这是您尚未遇到但可能会遇到的问题。只是不要使用 .h 文件,A 和 B 项目需要使用 Base 的程序集引用。
  • 感谢您的回复。我摆脱了#include "Base.h" 行,并将对 Base 项目的引用添加到 inheretec 类的项目中。但是,它现在无法识别 Base 类。我尝试添加#import "Base.dll",但无法加载文件。怎么了?
  • 当然很难猜。大的变化,你肯定需要 Build > Rebuild 来让 IntelliSense 再次变得足够聪明。当心名称空间,其他我们看不到的东西。如果您以前没有使用过任何 using namespace 语句,那么您现在肯定需要添加一些语句。
  • 亲爱的@HansPassant,我发现了问题。问题是由于我有一个包含托管文件的混合类型类。因此,托管文件的标题因此定义了两次。一个用于参考,一个用于包含。但是,我无法删除标题,因为混合类型类不在参考中。补充一点:混合类型类是混合类型,因为它有一个接口类构造函数参数。我用gcroot包裹它,没关系,但是由于接口的include语句,接口类被声明了两次。我该如何解决这个问题?你有什么建议吗?
  • 亲爱的@HansPassant,我从非托管头文件中删除了托管头文件,并将参数更改为 LPVOID。然后 reintepret_cast 接口到 LPVOID。有效。但是,这不是解决性能问题的好方法。所以我会尝试添加本地类的参考。感谢您的指导。

标签: .net inheritance dll c++-cli clr


【解决方案1】:

正如 Hans Passant 在评论中建议的那样,我摆脱了头文件并只使用了引用,最后继承起作用了。我只需要在 C# 端为基类设置一个别名,它与父类有继承关系。所以,下面的代码现在可以工作了。

AliasBase.Base base = new A();
base.CommonFunc();
base = new B();
base.CommonFunc();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2013-08-20
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多