我有一个const int,它是在我的托管C++DLL中编译时计算的。 我需要在调用它的 C# 程序中的属性中使用此值。 最初,我创建了一个返回 const int 值的静态方法,但 C# 不将其视为编译时常量。 我还尝试将其声明为 DLL 命名空间中的常量整数
// C++
namespace MyNameSpace {
const int AttributeConstValue = 15 + sizeof(int);
. . .
}
尝试从 C# 访问 MyNameSpace.AttributeConstValue 返回"命名空间 MyNameSpace 中不存在"
有没有办法将常量传递给 C# 并让它将其视为常量表达式?
必须使用 C++/CLI 文本关键字来声明对其他托管编译器可见的公共常量。 并且它必须出现在引用类中。 喜欢这个:
namespace Example {
public ref class Constants {
public:
literal int AttributeConstValue = 15 + sizeof(int);
};
}
C# 用法示例:
[MyAttribute(Example.Constants.AttributeConstValue)]
// etc..
请注意,这是相当危险的。 文本值编译到 C# 程序集的元数据中,而不引用 C++/CLI 程序集。 因此,如果对此声明进行更改,但不重新编译 C# 项目,则会出现严重的不匹配。 但是,只要您需要在属性声明中使用它,就无法解决此问题。
Const
与其他声明不同。当代码开始编译时 - 编译器只是将您使用const
的所有位置替换为其值 - 因为const
值无法更改。它解决一次 - 在编译时并保持这种状态。我真的不记得了,但我认为优化标志甚至从代码中删除const
声明。所以情况是这样的:当你完成编译时,你不能改变它 - 所以你第一次尝试 - 在某个函数中返回它,或者getter/setter是正确的。显然你不能把它返回到const
变量,因为要返回它你必须编译程序,当你编译程序时......你明白了:)
附言不知道C++但在 C# 中 const 是class
成员,无法在 namespace
中声明
在这里找到答案
// 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#属性的字段值使用此技术可以正常工作。 该值被视为编译时常量表达式。