【发布时间】: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