4

C# で C++/CLI dll からインターフェイスを実装したいと考えています。しかし、C++ での戻り値の最適化に問題があると思います。検討

// BVHTree.cpp:
public value struct Vector3
{
    float X, Y, Z;
};

public value struct TriangleWithNormal
{
    Vector3 A, B, C, Normal;
};

public interface class IBVHNode
{
    property TriangleWithNormal Triangle { TriangleWithNormal get(); } // among others
    property bool IsLeaf { bool get(); } // can implement this
};

// BVHNode.cs:
public class BVHNode : IBVHNode // Error: member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented (sth. along those lines)
{
    public TriangleWithNormal Triangle { get { return new TriangleWithNormal(); } }
    public bool IsLeaf { get { return true; } }
}

BVNode実装されていないと文句を言いますIBVHNode。私の最後の手段は、通常の方法でアクセスするか、ビジュアルスタジオが示唆するようなアンセーフモードを使用することです:

public TriangleWithNormal* get_Triangle(TriangleWithNormal* t) 
{ 
    throw new NotImplementedException();
}

プロパティ構文でそれを実装する方法はありますか (... を作成TriangleWithNormalする以外にref class)?

Update 1TriangleWithNormal GetTriangle()同じ理由でメソッドの実装が失敗するようです。ただし、のように使用できますvoid GetTriangle(TriangleWithNormal%);

4

2 に答える 2

2

いくつかのマイナーな構文エラーを修正し(;C ++ / CLIでのクラス宣言の後bool、戻り型としての単語が欠落しているIsLeaf.get())、Vector3型を定義すると、コードは機能しました。

Vector3がどのように定義されているかを推測しましたが、これは私が精通している標準クラスではありません。それはどこで定義されていますか?それはマネージドクラス、マネージド構造体、またはアンマネージドですか?(私はそれpublic value struct Vector3 { double x, y, z; };を私のテストとして定義しました。)

私が言ったように、ここに投稿したC ++/CLIコードにマイナーな構文エラーがあります。これらの2つのエラーは、非常に明確なコンパイルエラーをもたらすため、VisualStudioからWebへの文字起こしのタイプミスであると想定しています。あなたが投稿したものと実際のコードの間に他の変更はありますか?


また、ご報告いただいたエラーメッセージが届きませんでしたmember TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented。私はいつもコンパイルエラーで終わりますerror CS0535: 'CSharpTest.BVHNode' does not implement interface member 'CppCLITest.IBVHNode.Triangle'

表示したプロパティはパラメーターを取りませんが、コンパイラーエラーはget_Triangleタイプがパラメーターを受け取るメソッドを示していますTriangleWithNormal*。どこかにプロパティの別の宣言がありますか、それともそのメソッドの明示的な宣言がありますか?


私はそれを持っているかもしれないと思います。C ++ / CLIプロパティをインデックス付きプロパティとして宣言しようとすると、表示されているものと同様のメソッドシグネチャが取得されます。

実際のコードには、次のようなものがありますか?

property TriangleWithNormal Triangle[TriangleWithNormal] { TriangleWithNormal get(TriangleWithNormal input); }

これはインデックス付きのプロパティであり、C#では実装できません。(C#では1つのインデックス付きプロパティが許可されますがthis[]、それは1つだけです。)

これをC#で実装しようとすると、C#プロパティとして実装するのではなく、プロパティのバッキングメソッドを明示的に実装する必要があります。

public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
    return new TriangleWithNormal();
}

インデックス付きのプロパティを通常のプロパティにすると、これで問題なく機能するはずです。

于 2012-10-18T21:09:15.987 に答える
0

回避策でいくつかのビルドサイクルを行った後、エラーがなくなったことが判明しましたvoid GetTriangle(TriangleWithNormal%);。不思議に思うか、サイレントクリーンビルドである可能性が高いか、エラー状態をもう一度再現しようとしてエラーのあるプロパティにコメントすると、箱から出してコンパイルされました。

于 2012-10-19T23:42:09.260 に答える