编译后的函数定义不同

时间:2014-01-06 00:20:13

标签: dll static c++-cli

我有我的Keyboard类:

namespace BSGameFramework
{
namespace Input
{
    static public ref class Keyboard
    {
        public:

            static KeyboardState GetState();
    };
}
}

其中KeyboardState是一个ref struct。

从我的C#应用​​程序编译为dll后,我看到元数据中的函数如下:

namespace BSGameFramework.Input
{
public class Keyboard
{
    public Keyboard();

    public static void GetState(ref KeyboardState value);
}
}

键盘类已经失去了静态状态,而GetState函数现在返回void并将KeyboardState作为引用参数!

有人知道为什么吗?提前致谢:D

1 个答案:

答案 0 :(得分:1)

原因是因为返回类型ref struct KeyboardState

在C ++ / CLI中,“ref”与“value”决定了类型是引用类型还是值类型,而不是“类”与“结构”。 ref classref struct与C#的class都是一样的。 value classvalue struct与C#的struct都是一样的。

因此,您将C ++ / CLI方法声明为返回引用类型,但没有^。此数据类型确实存在于C ++ / CLI中,但不存在于C#中。您看到的方法签名是一种解决方法。

这个问题有两种可能的解决方案:

  • KeyboardState更改为value struct。从你的说法来看,听起来你从一开始就认为它是一种价值类型,所以这可能是最好的解决方案。
  • 将方法的返回类型更改为KeyboardState^。这将使该方法在C#中显示与在C ++ / CLI中相同。但是,如果您这样做,则需要将KeyboardState的所有用途切换为KeyboardState^。它是引用类型,应与^一起使用。