3

私は ac# アプリケーションを持っています。これは、c++-cli dll を参照します。c++ dll の名前空間では、public 構造体が宣言されています。

namespace Wrapper {

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

c++ dll には、ポインタを構造体へのポインタに返す関数があります。

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

C# アプリケーションは、c++ dll を参照し、構造体 (安全でないコード) のインスタンスを宣言します。

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

次に、次のように maxs のフィールドにアクセスしようとします。

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

ただし、その「名前」フィールドは c# インテリセンスでは表示されず、コンパイルされません。興味深いことに、C++ メタデータで構造体の定義を見に行ったところ、構造体は空白です。

using System;
using System.Runtime.CompilerServices;

namespaceWrapper
{
    [CLSCompliant(false)]
    [NativeCppClass]
    [UnsafeValueType]
    public struct Maxs
    {
    }
}

それは正常ですか?問題は、なぜ c# は public struct Maxs のフィールドを認識できないのでしょうか? また、メタデータ情報に空白の構造体が表示されるのはなぜですか? ありがとう。

4

1 に答える 1

1

これは私の知る限り正しい答えです:

管理された構造体ではないためです。代わりに、パブリック値構造体として宣言する必要があります。– Hans Passant 3 月 24 日 2:33

于 2013-05-10T18:55:11.563 に答える