Как только вы видите звезду или амперсанд, вам следует начать с преобразования ее в ref (безопасная версия указателя). У меня были ссылочные типы, которые волшебным образом начали работать, когда я использовал ключевое слово ref в прошлом (что весьма противоречиво - но я думаю, что это одна из тех вещей взаимодействия):
[DllImport("example.dll")]
private static extern void DoStuff(ref CodeElements codeElements);
Вы также можете попробовать:
[DllImport("example.dll")]
private static extern void DoStuff([In, Out] ref CodeElements codeElements);
Или одна из комбинаций этих атрибутов.
Одна вещь, которую вы, возможно, захотите попробовать, - это использовать MFC (я думаю, это было давно с C ++) для создания библиотеки COM. Не используйте собственный вызов, экспортируйте объект как библиотеку типов и добавьте его в качестве ссылки в Visual Studio (да, это так просто). Таким образом, вы получите что-то вроде:
myCoolClass.DoStuff(codeElements);
Возможно, вы также захотите закрепить его (если вам нужно закрепить его, ошибка будет прерывистой). Я не могу вспомнить, если RCW сделает это для вас (я почти уверен, что это будет), поэтому вот код, чтобы сделать это:
GCHandle handle = new GCHandle();
try
{
handle = GCHandle.Alloc(fooz, GCHandleType.Pinned);
// Use fooz.
}
finally
{
if (handle.IsAllocated)
handle.Free();
}