2013-03-24 2 views
2

У меня есть приложение C#. Он ссылается на dll C++ - cli. В пространстве имен C++ DLL публичная структура объявлена:Публичная структура в управляемой C++ dll не видна из C#

namespace Wrapper { 

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

Существует функция в C++ длл, которая возвращает указатель на указатель на структуру.

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

C# приложение ссылается на DLL C++ и объявляет экземпляр структуры (небезопасный код)

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# intellisense и не компилируется. Интересно, я пошел посмотреть определение структуры в метаданных C++ и структура пустой ..

using System; 
using System.Runtime.CompilerServices; 

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

Это нормально? Итак, вопрос в том, почему C# не видит поля публичной структуры Maxs? И почему информация метаданных показывает пустую структуру? спасибо.

+3

Потому что это не управляемая структура. Вам нужно будет объявить его как «public value struct». –

+0

Спасибо, Ханс! Это выполнило свою работу, и я узнал что-то новое. – user2192008

+0

@HansPassant: не могли бы вы ответить на этот вопрос, поэтому автор может его принять ..? Я знаю, что это довольно тривиально, но эта нить будет зависать иначе. Это скорее не подходит для закрытия. – quetzalcoatl

ответ

1

Это правильный ответ AFAIK:

Поскольку это не удалось структурой. Вам нужно будет объявить его как public value struct. - Hans Passant 24 марта в 2:33

Смежные вопросы