У меня есть приложение 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? И почему информация метаданных показывает пустую структуру? спасибо.
Потому что это не управляемая структура. Вам нужно будет объявить его как «public value struct». –
Спасибо, Ханс! Это выполнило свою работу, и я узнал что-то новое. – user2192008
@HansPassant: не могли бы вы ответить на этот вопрос, поэтому автор может его принять ..? Я знаю, что это довольно тривиально, но эта нить будет зависать иначе. Это скорее не подходит для закрытия. – quetzalcoatl