2017-12-06 20 views
1

私は、C++/cliで書かれた抽象基本クラスを持っています。このクラスはプロジェクト内にあります。そして、私はabtractベースクラスを継承する他のプロジェクトを持っています。したがって、その構造は以下のようになります。clrプロジェクトDLL間の継承

ベースのプロジェクト:

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' との間であいまいな参照です。私はC#プロジェクトのAとBの参照のexternエイリアスを定義しました。だから、私がAliasA.Fooのように使うと、それは大丈夫です。しかし、2つのAとB dllに2つのFooが存在します。それは問題だ。

と私は、次のようないくつかのコードを開発しようとすると、最後に、コンパイラはAliasBase.BaseはA.

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

エラーのベースであることを知っていません:暗黙的に変換できません。 'A'から 'Base'を入力してください

私は自分自身を明確にしたいと思います。サマー化する。私は3つのDLLを持っています。それらのうちの1つはベースのdllであり、他は継承されたクラスのdllです。継承されたクラスのdllには、内部に独自の基本実装が含まれています。基本クラスの複数のインプリメンタンスを取り除く方法はありますか?

注:はい、私はそれらをプロジェクトに集めても問題はありません。しかし、私はすべての派生項目のための分離dllを提供するように要求されています。

ありがとうございます。

+0

これはおそらく、.hファイルに入れて#他のソースファイルに#includeするコードです。だから、BaseとFooの定義は複数あります。そして、BとCには同じBaseクラスがありません。あなたがまだ実行していない問題ですが、おそらくそうなります。 .hファイルを使用しないで、AとBプロジェクトはBaseのアセンブリ参照を使用する必要があります。 –

+0

ご返信ありがとうございます。 #include "Base.h"行を取り除き、inheretecクラスのプロジェクトにBaseプロジェクトへの参照を追加します。しかし、今はBaseクラスを認識できません。 #import "Base.dll"を追加しようとしましたが、ファイルをロードできませんでした。どうしましたか? –

+0

当然推測するのは難しいです。大きな変更は、IntelliSenseを十分にスマートにするためにBuild> Rebuildが必要です。名前空間に気をつけてください。見えないものがあります。これまでに何も使用していない場合は、 'namespace'文を追加する必要があります。 –

答えて

0

Hans Passantがコメントで提案したように、私はヘッダーファイルを取り除き、参照のみを使用しました。最後の継承が機能しました。 C#側で基本クラスのエイリアスを1つだけ設定しなければなりませんでした。また、それはparantクラスと継承関係にあります。だから、次のコードが今働いている。

AliasBase.Base base = new A(); 
base.CommonFunc(); 
base = new B(); 
base.CommonFunc(); 
関連する問題