c# - 如何将 const int 从托管 C++ DLL 传递到 C# 以用作属性中的字段值

标签 c# c++ dll unmanaged managed

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

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

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

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

最佳答案

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

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

示例 C# 用法:

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

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

关于c# - 如何将 const int 从托管 C++ DLL 传递到 C# 以用作属性中的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213983/

相关文章:

c++ - 标记一个字符串,并将每个分隔符放在它自己的标记中

c# - 使用 PowerShell 查找最接近的 System.Color 实例

c# - 存储过程的返回值仅在 ASP.NET 中获取第一个字符

c# - ASP.NET:ModalPopupExtender 阻止触发按钮单击事件

c++ - 使用malloc转置数组

c# - 为什么我无法使用 HIDSharp 连接到 USB 复合设备?

c# - 停止非托管委托(delegate)的垃圾收集

c++ - 最好用正确的值实例化对象然后推送到 vector ,或者实例化,推送到 vector 然后设置正确的值?

C# 在使用 LoadLibrary/GetProcAddress 时调用 C 函数崩溃

我可以从程序 (DLL) 调用的 C++ 或 C 编译器