Я искал во всем Google, чтобы найти ответы на мои вопросы, но не совсем понимаю, что я нашел.У меня есть некоторые объекты, которые создаются и хранятся в C # List после использования System.IO для чтения некоторых текстовых файлов.После этого я хочу отправить ссылки (используя указатели const) на каждый из этих объектов во внутренние классы в C ++ dll, чтобы он мог использовать их для вычисления некоторых алгоритмов.
Вот несколько простых примеров (нефактический код) того, что я делаю:
Класс C #:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class SimpleClass
{
[MarshalAs(UnmanagedType.LPStr)]
public string Name;
public float Length;
}
с соответствующей структурой C:
struct SimpleClass
{
const char* Name;
float Length;
};
, хранящейся в
List<SimpleClass> ItemList;
после разбора некоторых текстовых файлов.
Затем вызов следующей функции dll:
C #:
[DllImport("SimpleDLL")]
public static extern void AddSimpleReference(SimpleClass inSimple);
C:
void AddSimpleReference(const SimpleClass* inSimple)
{
g_Vector.push_back(inSimple); // g_Vector is a std::vector<const SimpleClass* > type
}
Я попробовал следующее:
for(int i=0; i<ItemList.Count;++i)
{
SimpleClass theSimpleItem = ItemList[i];
AddSimpleReference(theSimpleItem);
}
Первоначально я думал, что будет легко получить фактическую ссылку / адрес, просто используя оператор присваивания, так как классы в C # передаются по ссылке, но получаетсячто класс C ++ всегда помещает одно и то же значение адреса (значение адреса временной ссылки) в контейнер вместо фактического адреса.Как получить фактические адреса объектов и отправить их в C ++ DLL, чтобы у них был доступ только для чтения к объектам C #?
ОБНОВЛЕНИЕ : Извините тех, кто опубликовал ответы с небезопаснымкоды.Я забыл упомянуть, что код C # фактически используется в качестве скрипта в игровом движке Unity, который не позволяет использовать небезопасные коды.