Генерация типа указателя C / CLI через System.CodeDom

#.net #c -cli #code-generation

#.net #c -cli #генерация кода

Вопрос:

Я генерирую код C / CLI через System.CodeDom из .NET.

Недавно мне пришлось создать метод C / CLI с указателем, например int foo(char *data) , что оказалось непросто.

System.CodeDom.CodeParameterDeclarationExpression(type, name) создает параметры только с помощью дескрипторов (^), а не с помощью указателей (*), и я не могу найти способ это сделать.

Как это можно было бы сделать? Приветствуется любая подсказка.

Ответ №1:

Наконец, я решаю программно удалить звездочку из типа, создать CodeTypeReference для типа без звездочки и создать переменную с именем, начинающимся со звездочки.

Другой способ — создать ключ «forcetypepasssthrough» для словаря пользовательских данных следующего типа:

 CodeTypeReference tmpTypeRef = new CodeTypeReference("char *");
tmpTypeRef.UserData["ForceTypePassThrough"] = true;

CodeVariableDeclarationStatement tmpVarDecl = new CodeVariableDeclarationStatement(tmpTypeRef, "tmpData");
  

Эти способы работают.

Ответ №2:

Я ничего не знаю, в частности, о типах указателей C / CLI, но вы можете использовать Type.MakePointerType для создания типа указателя для данного типа без указателя. Вы пробовали использовать:

 new CodeParameterDeclarationExpression(typeof(char).MakePointerType(), "data")
  

Комментарии:

1. Хорошая идея, но она создает System::Char ^*, а не System::Char *, который мне нужен.

2. @Anton: Странно. Боюсь, в таком случае у меня закончились идеи. Я оставлю этот ответ, чтобы вы не получили идентичные ответы 🙂

3. Дополнительное примечание: при компиляции c / cli ключевое слово «char» компилируется как System. SByte —не System.Char. Итак, вы захотите использовать typeof (SByte), а не typeof (char). Однако я не уверен в том, как правильно получить тип указателя.