#.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). Однако я не уверен в том, как правильно получить тип указателя.