1

我在我的托管 C++ DLL 中有一个在编译时计算的 const int。我需要在调用它的 C# 程序中的属性中使用这个值。最初,我创建了一个返回 const int 值的静态方法,但 C# 不将其视为编译时 const。我还尝试在 DLL 命名空间中将其声明为 const int

// C++
namespace MyNameSpace {
    const int AttributeConstValue = 15 + sizeof(int);
 . . .
}

尝试从 C# 访问 MyNameSpace.AttributeConstValue 返回“命名空间 MyNameSpace 中不存在”

有没有办法将 const 传递给 C# 并将其视为 const 表达式?

4

3 回答 3

2

您必须使用 C++/CLI文字关键字来声明对其他托管编译器可见的公共常量。它必须出现在 ref 类中。像这样:

namespace Example {
    public ref class Constants {
    public:
        literal int AttributeConstValue = 15 + sizeof(int);
    };
}

示例 C# 用法:

[MyAttribute(Example.Constants.AttributeConstValue)]
// etc..

请注意,这是相当危险的。文字值被编译到 C# 程序集的元数据中,而不引用您的 C++/CLI 程序集。因此,如果您更改此声明但重新编译 C# 项目,那么您将遇到严重的不匹配。但是只要您需要在属性声明中使用它,那么就没有解决办法。

于 2012-06-26T21:31:24.423 回答
0

Const与其他声明不同。当代码开始编译时——编译器只是用它的值替换你使用的所有地方const——因为const值无法改变。它解决了一次 - 在编译时并保持这种状态。我真的不记得了,但我认为优化标志甚至const从代码中删除声明。所以情况是这样的:当你完成编译时,你不能改变它——所以你首先尝试——在某个函数中返回它,或者 getter/setter 是正确的。显然你不能将它返回给const变量,因为返回它你必须编译程序,当你编译程序时......你明白了:)

PS 不了解 C++,但在 C# 中 const 是class成员,无法在其中声明namespace

于 2012-06-26T21:19:03.120 回答
0

在这里找到答案

// C++ Const declaration
namespace MyNameSpace {
public ref class ConstClass {
public:
     literal int AttributeConstValue = 15 + sizeof(int);
. . .
}

// C# Usage
[MarshalAs(UnmanagedType.ByValArray, SizeConst=MyNameSpace.ConstClass.AttributeConstValue)]
public byte [] results;

使用此技术将 MyNameSpace.ConstClass.AttributeConstValue 引用为 C# 属性的字段值可以正常工作。该值被视为编译时常量表达式。

于 2012-06-26T21:20:33.577 回答