托管c++ DLL中的公共结构不能从c#中看到

本文关键字:不能 结构 c++ DLL 托管 | 更新日期: 2023-09-27 18:05:25

我有一个c#应用程序。它引用了一个c++-cli dll。在c++ dll的命名空间中声明了一个公共结构体:

namespace Wrapper {
  public struct maxs
  {
     public:
      char Name[255];
      int num;
  };
etc

c++ dll中有一个函数,它返回指向结构体指针的指针。

Wrapper::Maxs** Wrapper::Class1::CallMax();

c#应用程序引用c++ dll并声明一个struct(不安全代码)的实例

 Wrapper.Class1 oMax = new Wrapper.Class1()
 Wrapper.Maxs** maxs; 
 maxs= oMax.CallMax();
 int num = oMax.m_num;

然后我尝试像这样访问max的字段:

for(int i = 0; i < num; ++i)
 {
    name = maxs[i]->name;
  }

然而,这个'name'字段在c#智能感知中是不可见的,并且不会编译。有趣的是,我去看了c++元数据中结构体的定义,结构体是空白的。

using System;
using System.Runtime.CompilerServices;
namespaceWrapper
{
    [CLSCompliant(false)]
    [NativeCppClass]
    [UnsafeValueType]
    public struct Maxs
    {
    }
}

正常吗?那么问题来了:为什么c#看不到公共结构体max的字段?为什么元数据信息显示一个空白结构?谢谢。

托管c++ DLL中的公共结构不能从c#中看到

这是正确的答案:

因为它不是一个托管结构。您需要将其声明为公共值结构。- Hans Passant Mar 24 at 2:33