c# - 从 C# 访问托管 C++ 结构

标签 c# c++-cli managed

我有一个托管的 C++ dll,其中包含以下内容

public value struct StructOuter
{
   public:
      int m_int_InStructOuter;
};

public ref class ClassContainingStruct : MyBase
{
   public:
          StructOuter^ m_strucOuter_InClassContainingStruct;
};

我试图从“C#”应用程序访问托管 DLL 的以下内容: 我收到要转换为派生类的基类类型对象 对象如下。

ClassContainingStruct  ccs = (ClassContainingStruct)base;

当我尝试打印 ccs 的内容时, ccs.m_strucOuter_InClassContainingStruct Intellisense 向我显示为 ValueType。 这是真的,但如果尝试访问 ValueType 的内容,即 m_int_InStructOuter 即 ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter 编译时报如下错误:

Error 1 'System.ValueType' does not contain a definition for 'm_int_InStructOuter' and no extension method 'm_int_InStructOuter' accepting a first argument of type 'System.ValueType' could be found (are you missing a using directive or an assembly reference?)

当我尝试在 C# 应用程序上定义 ClassContainingStruct 类时 它定义如下(根据元数据):

public class ClassContainingStruct : MyBase
{
        public ValueType m_strucOuter_InClassContainingStruct;
        ....
        [HandleProcessCorruptedStateExceptions]
        protected override void Dispose(bool value);
}
  1. 为什么提到它是 ValueType 而不是 StructOuter 类型
  2. 为什么我在尝试访问 ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter 时遇到编译错误

最佳答案

您没有正确声明它。值类型的变量不应该用 ^ 帽子声明。这将创建一个始终装箱的值类型值。不是 C# 理解的东西,它没有等效的语法,它只能将其映射到 System.ValueType。仅在引用类型上使用帽子。您还忘记声明变量 public。修复:

public ref class ClassContainingStruct : MyBase
{
public:
   StructOuter m_strucOuter_InClassContainingStruct;   // Note: no hat
};

与在 C# 中一样,您应该改用属性访问器。

关于c# - 从 C# 访问托管 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558585/

相关文章:

c# - 使用 MDX 时缺少 Direct3D.dll 依赖项

c# - .NET react 框架 : ReplaySubject OnError: Why does it throw the exception?

c++ - CLR中 native 堆的内存管理

c++ - 有没有办法在编译时实例化所有 C++ 模板大小?

c# - 无法用VS 2010 Express打开WP7的解决方法

c# - 如何从格式化字符串中提取值?

c++ - 为什么在前向声明后出现未定义类型错误?

c++ - 如何在 Visual C++ 中创建非托管 Windows GUI?

service - 定义自定义托管服务失败

c# - 在 C# 中将 byval C 结构编码(marshal)为返回值