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。我最后的手段是通过常规方法或使用 Visual Studio 建议的不安全模式访问它:

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

有没有办法仍然在属性语法中实现它(除了制作TriangleWithNormal... ref class)?

更新 1似乎是因为TriangleWithNormal GetTriangle()同样的原因实现方法失败。但是,您可以像void GetTriangle(TriangleWithNormal%);.

4

2 回答 2

2

一旦我修复了几个小的语法错误(;在 C++/CLI 中的类声明之后,缺少bool返回类型 of的单词IsLeaf.get()),您的代码对我有用,并定义了 Vector3 类型。

我猜你是如何定义 Vector3 的,它不是我熟悉的标准类。它在哪里定义?它是托管类、托管结构还是非托管?(我将其定义public value struct Vector3 { double x, y, z; };为我的测试。)

正如我所说,您在此处发布的 C++/CLI 代码中存在轻微的语法错误。这两个错误给出了非常明显的编译错误,所以我假设这些是从 Visual Studio 到 Web 的转录中的拼写错误。您发布的内容与实际代码之间是否还有其他更改?


此外,我无法收到您报告的错误消息,member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented. 我总是以编译错误结束error CS0535: 'CSharpTest.BVHNode' does not implement interface member 'CppCLITest.IBVHNode.Triangle'

您显示的属性不带参数,但编译器错误显示了一个get_Triangle采用 type 参数的方法TriangleWithNormal*。您是否在某处有另一个属性声明,或者明确声明了该方法?


我想我可能拥有它。如果我尝试将 C++/CLI 属性声明为索引属性,那么我会得到一个类似于您所看到的方法签名。

在您的实际代码中,您是否有这样的东西:

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

这是一个索引属性,C# 不允许您实现。(C# 确实允许一个索引属性this[],但只允许那个。)

当我尝试在 C# 中实现它时,它需要我显式地实现属性的支持方法,而不是将其实现为 C# 属性。

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

使索引属性成为常规属性,这对您来说应该很好。

于 2012-10-18T21:09:15.987 回答
0

It turned out that the error was gone after I lived some build cycles with my void GetTriangle(TriangleWithNormal%); workaround. Be it a wonder or more likely a silent clean build, upon commenting in the errorneous property trying to reproduce the error condition one more time, it compiled out of the box.

于 2012-10-19T23:42:09.260 回答