Это команда create-native-map, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
create-native-map - C / C # Mapping Creator
СИНТАКСИС
создать родную карту [ОПЦИИ] * НАЗВАНИЕ-ФАЙЛ-СБОРКА ВЫХОД-ПРЕФИКС
ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ, НЕ ВКЛЮЧЕННЫЕ В ПАКЕТ
--autoconf-header = ЗАГОЛОВОК
HEADER - это имя файла заголовка в синтаксисе, обычно используемом с C #включают
заявление, например #включают or #включают "local.h" .
Макрос в формате Autoconf создается из включаемого имени и #включают
директива заключена в #ифдеф блок для макроса Autoconf внутри
генерируется .c .
Например, --autoconf-header = сгенерирует код:
#ifndef HAVE_STDIO_H
#включает в себя
#endif / * ndef HAVE_STDIO_H * /
--autoconf-member = УЧАСТНИК
Укажите, что любой доступ к СЛУЖБА должны быть завернуты в #ифдеф HAVE_MEMBER
блок. СЛУЖБА может быть либо название поля или имя класса . название поля
сочетания клавиш.
Например, учитывая объявление C #:
[Mono.Unix.Native.Map ("struct dirent")]
структура Dirent {
публичный длинный d_off;
}
тогда --autoconf-member = d_off сгенерирует код, подобный:
Int
ToDirent (struct dirent * from, struct Dirent * to)
{
#ifdef HAVE_STRUCT_DIRENT_D_OFF
to-> d_off = from-> d_off;
#endif / * ndef HAVE_STRUCT_DIRENT_D_OFF * /
}
--exclude-native-symbol = СИМВОЛ
SYMBOL - это [Дллимпорт] -отмеченный метод, который должен создать прототип
за это.
--impl-header = ЗАГОЛОВОК
Вставьте #включают заявление в сгенерированном .c файл для HEADER .
Например, --impl-header = генерирует
#включают
--impl-macro = МАКРОС
Вставьте #define заявление в сгенерированном .c . MACRO может содержать = в
отделите имя макроса от значения макроса.
Например, --impl-macro = FOO = 42 генерирует
# определить FOO 42
--library = БИБЛИОТЕКА
Создавайте прототипы для [Дллимпорт] -отмеченные методы, которые ссылаются на родной
библиотека БИБЛИОТЕКА в сгенерированный .h .
--public-header = ЗАГОЛОВОК
Вставьте #включают заявление в сгенерированном .h файл для HEADER .
Например, --public-header = генерирует
#включают
--public-macro = МАКРОС
Вставьте #define заявление в сгенерированном .h . MACRO может содержать = в
отделите имя макроса от значения макроса.
Например, --public-macro = FOO = 42 генерирует
# определить FOO 42
--rename-member = ОТ = ДО
Это используется, когда от является макросом C и, следовательно, должен быть изменен, чтобы его можно было использовать
разумно. Все сгенерированные ссылки на управляемое представление будут использовать К вместо
of от .
Например, учитывая объявление C #:
[Mono.Unix.Native.Map ("struct stat")]
структура статистики {
публичные длинные st_atime;
}
и аргумент --rename-member = st_atime = st_atime_ , сгенерированный .h файл будет
содержать:
структура статистики {
gint64 st_atime_;
};
(обратите внимание на измененное имя поля), а сгенерированный .c файл будет содержать:
ToStat (struct stat * from, struct Stat * to)
{
to-> st_atime_ = from-> st_atime;
}
--rename-namespace = ОТ = ДО
По умолчанию «пространство имен» C (префикс символа) является пространством имен C #; типы в
C # пространство имен Моно.Unix.Native будет в C "пространстве имен" Mono_Unix_Native . Используйте
--rename-пространство имен чтобы изменить значение по умолчанию, например --переименовать-
namespace = Mono.Unix.Native = Mono_Posix .
ОПИСАНИЕ
создать родную карту это программа для определенного сценария: сохранение кода, который строго
связаны между C и C # синхронно друг с другом на основе типов C #.
Вызов платформы полезен только в том случае, если управляемый код знает точные типы и макет всех
неуправляемые структуры, которые он использует. Обычно это имеет место в Windows, но это не так. случай
в Unix. Например, структура состояние использует типы с размерами, которые будут отличаться от
платформу к платформе (или даже на основе определенных макросов компилятора!). Например, off_t
обычно является 32-битным целым числом со знаком на платформах ILP32, но может быть 64-битным целым числом со знаком
на платформах LP64, но также может быть 64-битным целым числом со знаком на платформах ILP32, если
_ФАЙЛ_OFFSET_BITS макрос имеет значение 64. Короче говоря, в Unix все гибко,
а управляемый код не может справиться с такой гибкостью.
Таким образом, ниша для создать родную карту : предположим, что фиксированный ABI, на который может ориентироваться управляемый код,
и сгенерируйте код для преобразования управляемых представлений в соответствующие собственные
представления. Это нужно сделать для многое которые могут различаться между платформами и
флаги компилятора из значений перечисления ( СИГБУС имеет значение 10 на FreeBSD, но 7 на
Linux) для структурирования членов (насколько велик off_t ?).
создать родную карту будет проверять СБОРКА-ИМЯ-ФАЙЛ и выведите следующие файлы:
ВЫХОД-ПРЕФИКС.h
Содержит значения перечисления, объявления классов и структур, делегат
декларации и [Дллимпорт] отмеченные методы (из библиотеки, указанной
--библиотека ) внутри сборки СБОРКА-ИМЯ-ФАЙЛ .
ВЫХОД-ПРЕФИКС.c
Содержит реализацию перечисления и преобразования структуры
функции.
ВЫХОД-ПРЕФИКС.cs
Содержит частичный класс НативКонвертировать содержащий перевод перечисления
методы.
ВЫХОД-ПРЕФИКС.xml
Создает заглушки документации ECMA XML для перевода перечисления
методы в ВЫХОД-ПРЕФИКС.cs .
создать родную карту в первую очередь ищет Атрибут карты -одекорированные типы, и использует два
Атрибут карты свойства:
Родной тип
Содержит соответствующий тип C. Полезно, только если применяется к классам,
структуры и поля.
Подавить флаги
Если указано в члене перечисления [Flags] -декорированная нумерация
типа, отключает поддержка генератора нормального кода для перечисления с побитовой маской
типы.
Это полезно, когда информация о битовой и небитовой маске хранится в
тот же тип, и проверка битовой маски не должна использоваться для небитовой маски
ценности. Пример: Mono.Unix.Native.FilePermissions.S_IFREG , который не является
значение битовой маски, в то время как большая часть Разрешения на доступ к файлам состоит из значений битовой маски (
FilePermissions.S_IRUSR , FilePermissions.S_IWUSR И т.д.).
Команда Атрибут карты атрибут может быть указан в классах, структурах, делегатах, полях и
перечисления.
Делегаты
Генерация кода для делегатов игнорирует MapAttribute.NativeType собственность, и
генерирует указатель на функцию ЬурейеЕ что лучше всего соответствует объявлению делегата
в .h .
Например,
пространство имен Фу {
[Карта]
строка делегата MyCallback (строка s);
}
генерирует ЬурейеЕ :
typedef char * (* Foo_MyCallback) (const char * s);
Классы и структуры
A [Карта] -декорированный класс или структура получит объявление структуры C в пределах
.h файл:
[Карта]
структура Фу {
общественный интервал я;
}
становится
структура Фу {
общественный интервал я;
};
Если же линия индикатора MapAttribute.NativeType свойство установлено, то функции преобразования будут
заявлено в .h файл и создан в .c файл:
пространство имен Фу {
[Карта ("struct stat")]
структура статистики {
общедоступный uint st_uid;
}
}
становится
/ * Файл .h * /
структура Foo_Stat {
беззнаковый int st_uid;
};
Int
Foo_FromStat (struct Foo_Stat * from, struct stat * to);
Int
Foo_ToStat (struct stat * to, sxtruct Foo_Stat * to);
/ * Файл .c * /
Int
Foo_FromStat (структура Foo_Stat * от, структура stat * до)
{
memset (до, 0, sizeof (* до);
to-> st_uid = from-> st_uid;
0 вернуться;
}
Int
Foo_ToStat (struct stat * to, sxtruct Foo_Stat * to)
{
memset (до, 0, sizeof (* до);
to-> st_uid = from-> st_uid;
0 вернуться;
}
Для классов функции преобразования будут копировать только поля, объявленные в классе.
сам. Поля, объявленные в родительских классах, копироваться не будут. (Это потому что
создать родную карту не знает, как наследование реализовано в C. Поэтому
копирование полей из родительских классов остается на усмотрение вызывающего преобразователя
функции.)
Поля Если поле (1) имеет Атрибут карты атрибут, а (2) имеет
MapAttribute.NativeType набор свойств, то будет использоваться указанный собственный тип
для проверки переполнения. Например:
пространство имен Фу {
[Карта ("struct stat")]
структура статистики {
[Карта ("off_t")] общедоступный long st_size;
}
}
генерирует
/ * Файл .h * /
структура Foo_Stat {
gint64 st_size;
};
Int
Foo_FromStat (struct Foo_Stat * from, struct stat * to);
Int
Foo_ToStat (struct stat * to, sxtruct Foo_Stat * to);
/ * Файл .c * /
Int
Foo_FromStat (структура Foo_Stat * от, структура stat * до)
{
_cnm_return_val_if_overflow (off_t, from-> st_size, -1);
memset (до, 0, sizeof (* до);
to-> st_size = from-> st_size;
0 вернуться;
}
Int
Foo_ToStat (struct stat * to, sxtruct Foo_Stat * to)
{
_cnm_return_val_if_overflow (gint64, from-> st_size, -1);
memset (до, 0, sizeof (* до);
to-> st_size = from-> st_size;
0 вернуться;
}
Это полезно для лучшей проверки ошибок в функциях преобразования.
MapAttribute.NativeType для этого требуется, поскольку нет другого способа узнать, что
собственный тип (без разбора файлов системных заголовков ...).
Перечисления
Создает перечисление C и макросы для каждого из членов в пределах
перечисление. к и от функции также объявлены в .h файлов и
реализовано в .c .
Например,
пространство имен Фу {
[Карта]
перечисление Errno {
ЭИНВАЛ
}
}
сгенерирует следующее в .h файл:
перечисление Foo_Errno {
Foo_Errno_EINVAL = 0,
#define Foo_Errno_EINVAL Foo_Errno_EINVAL
};
int Foo_FromErrno (int от, int * до);
int Foo_ToErrno (int от, int * до);
и генерирует следующее в .c файл:
Int
Foo_FromErrno (целое от, целое * до)
{
* to = 0;
если (от == Foo_Errno_EPERM)
#ifdef ЭИНВАЛ
{* to = EINVAL;}
#еще
{ошибка = EINVAL; вернуть -1;}
#endif
0 вернуться;
}
Int
Foo_ToErrno (целое от, целое * до)
{
* to = 0;
#ifdef ЭИНВАЛ
если (от == EINVAL)
{* to = Foo_Errno_EPERM; return 0;}
#endif
возврат -1;
}
Другой код будет сгенерирован, если управляемое перечисление является [Flags] -украшенный
перечисление (для учета побитовых флагов), но это основная идея.
ПОЧТОВОЕ ОТПРАВЛЕНИЕ СПИСКИ
Войти http://lists.ximian.com/mailman/listinfo/mono-devel-list для получения информации.
Разработка САЙТ
Войти http://www.mono-project.com подробнее
создать родную карту(1)
Используйте create-native-map онлайн с помощью сервисов onworks.net