2016-09-16 12 views
2

私はC#から使用したい混合モードのC++/CLIクラスとインターフェイスを持っています。インタフェースは、次のように定義される:C++/CLIインターフェイスのプロパティを使用できません

public interface class IMapRenderingInterfacer 
{ 
    ... 
    property int CurrentCacheSize { int get(); }; 
    ... 
}; 

実装クラスは、そのヘッダファイルでこの宣言有する:

int MapRenderingInterfacer::CurrentCacheSize::get() 
{ 
    return (*_nativeMapRenderingInterface)->getCurrentCacheSize()/1000000; 
} 

public ref class MapRenderingInterfacer : public IMapRenderingInterfacer 
{ 
    ... 
public: 
    virtual property int CurrentCacheSize { int get(); } 
    ... 
}; 

とプロパティの実装をCPPファイルであります

これはエラーや警告なしでコンパイルしますが、C#クラスからこのプロパティを使用しようとすると、次のエラーが発生します。

エラーCS1061 'IMapRenderingInterfacer'に 'CurrentCacheSize'の定義が含まれておらず、 'IMapRenderingInterfacer'タイプの最初の引数を受け入れる拡張メソッド 'CurrentCacheSize'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか)

このインターフェイスには、C#からはうまく使えるが、このプロパティでは使用できない多くのメソッドも含まれています。

アイデア?

+0

あなたは管理プロパティ( 'CurrentCacheSize')を宣言しましたが、プレーンなネイティブメソッド(' MapRenderingInterfacer :: CurrentCacheSize :: get() ')を実装しました。マネージクラスがネイティブリソースにアクセスするようにするには、ネイティブクラスのインスタンシエーションにポインタを格納し、コールを転送します([How to:C++/CLIでのプロパティの使用](https://msdn.microsoft.com/en-us)を参照してください。 /library/2f1ec0b1.aspx))。それがあなたがしようとしていたものなら、プロパティの実装で正しい構文を使用することを確認してください。 (また、あなたのインターフェイスは、仮想プロパティを宣言しません。これは意図的ですか?) – IInspectable

+0

ありがとう!私は実際にそのWebページを参考にしました。特に "Virtual Properties"の例では、ヘッダーファイルの代わりにcppに実装を保存する必要があります。https://social.msdn.microsoft .com/Forums/vstudio/en-US/6b272758-9f8c-412f-912b-27a841e18ee2/ccli-syntax-for-declaration-property-in-h-implement-it-in-cpp-?フォーラム= vclanguage – tseval

+1

基本事項唯一の明白な説明は、あなたのC#プロジェクトが古いバージョンのC++/CLIアセンブリへの参照を持っているということです。参照を選択し、プロパティウィンドウで表示されているパスを確認し、日付を確認します。そして、両方のプロジェクトを同じソリューションに入れて、C#プロジェクトでプロジェクト参照を使用するようにしてください。そうすれば、間違ってしまうことはありません。 –

答えて

1

Hans Passant そうでした!これは単に混在モードアセンブリの間違ったバージョンを指していたプロジェクト参照でした。プロジェクトの参照を削除してもう一度追加することは、トリックでした!

関連する問題