Ini ialah arahan create-native-map yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
create-native-map - C/C# Mapping Creator
SINOPSIS
cipta-peta-asli [PILIHAN]* ASEMBLY-FAIL-NAME OUPUT-PREFIX
PILIHAN
--autoconf-header=HEADER
KEPALA ialah nama fail pengepala dalam sintaks yang biasanya digunakan dengan C #include
kenyataan, cth #include or #include "local.h" .
Makro berformat Autoconf dijana daripada nama sertakan dan a #include
arahan dibungkus dalam a #ifdef blok untuk makro Autoconf dalam
dijana .c fail.
Sebagai contoh, --autoconf-header= akan menghasilkan kod:
#ifndef MEMPUNYAI_STDIO_H
#sertakan
#endif /* ndef HAVE_STDIO_H */
--autoconf-member=AHLI
Nyatakan bahawa sebarang akses kepada AHLI hendaklah dibalut dalam a #ifdef ADA_AHLI
blok. AHLI boleh sama ada a nama medan atau nama kelas . nama medan
gabungan.
Sebagai contoh, diberikan pengisytiharan C#:
[Mono.Unix.Native.Map ("struct dirent")]
struct Dirent {
public long d_off;
}
kemudian --autoconf-member=d_off akan menghasilkan kod yang serupa dengan:
int
ToDirent (struct dirent *dari, struct Dirent *to)
{
#ifdef ADA_STRUCT_DIRENT_D_OFF
to->d_off = dari->d_off;
#endif /* ndef HAVE_STRUCT_DIRENT_D_OFF */
}
--exclude-native-symbol=SIMBOL
SYMBOL ialah [DllImport] -kaedah bertanda yang sepatutnya tidak mempunyai prototaip yang dihasilkan
untuk ia.
--impl-header=HEADER
Masukkan a #include pernyataan dalam yang dihasilkan .c fail untuk KEPALA .
Sebagai contoh, --impl-header= menjana
#sertakan
--impl-macro=MAKRO
Masukkan a #tentukan pernyataan dalam yang dihasilkan .c fail. MAKRO boleh mengandungi a = kepada
asingkan nama makro daripada nilai makro.
Sebagai contoh, --impl-macro=FOO=42 menjana
#define FOO 42
--library=PERPUSTAKAAN
Buat prototaip untuk [DllImport] -kaedah bertanda yang merujuk kepada orang asli
perpustakaan PERPUSTAKAAN ke dalam yang dihasilkan .h fail.
--public-header=HEADER
Masukkan a #include pernyataan dalam yang dihasilkan .h fail untuk KEPALA .
Sebagai contoh, --public-header= menjana
#sertakan
--public-macro=MAKRO
Masukkan a #tentukan pernyataan dalam yang dihasilkan .h fail. MAKRO boleh mengandungi a = kepada
asingkan nama makro daripada nilai makro.
Sebagai contoh, --makro-awam=FOO=42 menjana
#define FOO 42
--rename-member=FROM=TO
Ini digunakan apabila DARIPADA ialah makro C, dan oleh itu mesti diubah untuk digunakan
secara waras. Semua rujukan yang dijana kepada perwakilan terurus akan digunakan KEPADA sebaliknya
of DARIPADA .
Sebagai contoh, diberikan pengisytiharan C#:
[Mono.Unix.Native.Map ("statistik struktur")]
struct Stat {
masa lama awam;
}
dan hujahnya --rename-member=st_atime=st_atime_ , yang dihasilkan .h fail akan
mengandungi:
struct Stat {
gint64 st_atime_;
};
(perhatikan nama medan yang diubah), manakala yang dihasilkan .c fail akan mengandungi:
ToStat (stat struct *daripada, Stat struct *kepada)
{
ke->st_atime_ = dari->st_atime;
}
--rename-namespace=FROM=TO
Secara lalai, "ruang nama" C (awalan simbol) ialah ruang nama C#; jenis dalam
Ruang nama C# Mono.Unix.Native akan berada dalam "ruang nama" C Mono_Unix_Native . Penggunaan
--rename-namespace untuk mengubah suai lalai, cth --namakan semula-
ruang nama=Mono.Unix.Native=Mono_Posix .
DESCRIPTION
cipta-peta-asli ialah program untuk senario tertentu: menyimpan kod yang ketat
digandingkan antara C dan C# selari antara satu sama lain, berdasarkan jenis C#.
Platform Invoke hanya berguna jika kod terurus mengetahui jenis dan reka letak yang tepat bagi semua
struktur tidak terurus yang digunakannya. Ini biasanya berlaku pada Windows, tetapi ia adalah tidak mana-mana yang
pada Unix. Sebagai contoh, struktur stat menggunakan jenis dengan saiz yang berbeza dari
platform ke platform (atau pun berdasarkan makro pengkompil yang ditakrifkan!). Sebagai contoh, off_t
biasanya merupakan integer 32-bit yang ditandatangani pada platform ILP32, tetapi mungkin integer 64-bit yang ditandatangani
pada platform LP64, tetapi juga boleh menjadi integer bertanda 64-bit pada platform ILP32 jika
_FILE_OFFSET_BITS makro mempunyai nilai 64. Pendek kata, semuanya fleksibel dalam Unix,
dan kod terurus tidak dapat menangani fleksibiliti sedemikian.
Oleh itu, niche untuk cipta-peta-asli : anggap ABI tetap yang boleh disasarkan oleh kod terurus,
dan menjana kod untuk "mengambil" perwakilan terurus kepada asli yang sepadan
perwakilan. Ini perlu dilakukan untuk semua yang boleh berbeza antara platform dan
bendera pengkompil, daripada nilai penghitungan ( SIGBUS mempunyai nilai 10 pada FreeBSD tetapi 7 pada
Linux) untuk menstrukturkan ahli (berapa besarnya off_t ?).
cipta-peta-asli akan memeriksa NAMA-FAIL PERHIMPUNAN dan keluarkan fail berikut:
OUTPUT-PREFIX.h
Mengandungi nilai penghitungan, pengisytiharan kelas dan struktur, perwakilan
pengisytiharan, dan [DllImport] -kaedah bertanda (dari perpustakaan yang ditentukan oleh
--perpustakaan ) dalam perhimpunan NAMA-FAIL PERHIMPUNAN .
OUTPUT-PREFIX.c
Mengandungi pelaksanaan penghitungan dan penukaran struktur
fungsi.
OUTPUT-PREFIX.cs
Mengandungi kelas separa NativeConvert mengandungi terjemahan enumerasi
kaedah.
OUTPUT-PREFIX.xml
Menghasilkan stub dokumentasi XML ECMA untuk terjemahan penghitungan
kaedah dalam OUTPUT-PREFIX.cs .
cipta-peta-asli terutama mencari MapAttribute -jenis berhias, dan menggunakan dua
MapAttribute hartanah:
NativeType
Mengandungi jenis C yang sepadan. Hanya berguna jika digunakan pada kelas,
struktur, dan medan.
SuppressFlags
Apabila dinyatakan pada ahli penghitungan a [Bendera] -hitungan berhias
jenis, melumpuhkan sokongan penjana kod biasa untuk penghitungan penutup bit
jenis.
Ini berguna apabila maklumat bitmask dan bukan bitmask disimpan dalam
jenis yang sama, dan semakan bitmask tidak boleh digunakan untuk bukan bitmask
nilai. Contoh: Mono.Unix.Native.FilePermissions.S_IFREG , yang bukan a
nilai bitmask, manakala kebanyakan FilePermissions terdiri daripada nilai bitmask (
FilePermissions.S_IRUSR , FilePermissions.S_IWUSR , dan lain-lain.).
. MapAttribute atribut boleh ditentukan pada kelas, struktur, perwakilan, medan dan
penghitungan.
Perwakilan
Penjanaan kod untuk perwakilan mengabaikan MapAttribute.NativeType harta tanah, dan
menghasilkan penunjuk fungsi mesin taip yang paling sepadan dengan pengisytiharan perwakilan
ke .h fail.
Sebagai contoh,
ruang nama Foo {
[Peta]
mewakilkan rentetan MyCallback (rentetan s);
}
menjana mesin taip :
typedef char* (*Foo_MyCallback) (const char *s);
Kelas dan Struktur
A [Peta] -kelas atau struktur yang dihias akan mendapat pengisytiharan struktur C dalam
.h fail:
[Peta]
struct Foo {
int awam i;
}
menjadi
struct Foo {
int awam i;
};
Jika MapAttribute.NativeType harta ditetapkan, maka fungsi penukaran akan menjadi
diisytiharkan dalam .h fail dan dibuat dalam .c fail:
ruang nama Foo {
[Peta ("statistik struktur")]
struct Stat {
awam uint st_uid;
}
}
menjadi
/* Fail .h */
struct Foo_Stat {
unsigned int st_uid;
};
int
Foo_FromStat (struktur Foo_Stat *daripada, stat struct *ke);
int
Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to);
/* Fail .c */
int
Foo_FromStat (struct Foo_Stat *dari, struct stat *to)
{
memset (kepada, 0, sizeof(*to);
to->st_uid = from->st_uid;
0 kembali;
}
int
Foo_ToStat (statistik struktur *kepada, sxtruct Foo_Stat *kepada)
{
memset (kepada, 0, sizeof(*to);
to->st_uid = from->st_uid;
0 kembali;
}
Untuk kelas, fungsi penukaran hanya akan menyalin medan yang diisytiharkan dalam kelas
sendiri. Medan yang diisytiharkan dalam kelas induk tidak akan disalin. (Ini adalah kerana
cipta-peta-asli tidak tahu bagaimana pewarisan dilaksanakan dalam C. Oleh itu
menyalin medan daripada kelas induk diserahkan kepada pemanggil penukaran
fungsi.)
Medan Jika medan (1) mempunyai MapAttribute atribut, dan (2) mempunyai
MapAttribute.NativeType set harta, maka jenis asli yang ditentukan akan digunakan
untuk pemeriksaan limpahan. Sebagai contoh:
ruang nama Foo {
[Peta ("statistik struktur")]
struct Stat {
[Peta ("off_t")] st_size panjang awam;
}
}
menjana
/* Fail .h */
struct Foo_Stat {
gint64 st_size;
};
int
Foo_FromStat (struktur Foo_Stat *daripada, stat struct *ke);
int
Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to);
/* Fail .c */
int
Foo_FromStat (struct Foo_Stat *dari, struct stat *to)
{
_cnm_return_val_if_overflow (off_t, from->st_size, -1);
memset (kepada, 0, sizeof(*to);
to->st_size = dari->st_size;
0 kembali;
}
int
Foo_ToStat (statistik struktur *kepada, sxtruct Foo_Stat *kepada)
{
_cnm_return_val_if_overflow (gint64, from->st_size, -1);
memset (kepada, 0, sizeof(*to);
to->st_size = dari->st_size;
0 kembali;
}
Ini berguna untuk semakan ralat yang lebih baik dalam fungsi penukaran.
MapAttribute.NativeType diperlukan untuk ini kerana tidak ada cara lain untuk mengetahui apa
jenis asli ialah (tanpa menghuraikan fail pengepala sistem...).
Penghitungan
Menghasilkan penghitungan C dan makro untuk setiap ahli dalam
penghitungan. Untuk and daripada fungsi juga diisytiharkan dalam .h fail dan
dilaksanakan dalam .c fail.
Sebagai contoh,
ruang nama Foo {
[Peta]
enum Errno {
EINVAL
}
}
akan menjana yang berikut dalam .h fail:
enum Foo_Errno {
Foo_Errno_EINVAL = 0,
#define Foo_Errno_EINVAL Foo_Errno_EINVAL
};
int Foo_FromErrno (int dari, int *ke);
int Foo_ToErrno (int dari, int *ke);
dan menjana yang berikut dalam .c fail:
int
Foo_FromErrno (int from, int *to)
{
*kepada = 0;
jika (dari == Foo_Errno_EPERM)
#ifdef EINVAL
{*kepada = EINVAL;}
#selamat
{errno = EINVAL; kembali -1;}
#endif
0 kembali;
}
int
Foo_ToErrno (int from, int *to)
{
*kepada = 0;
#ifdef EINVAL
jika (dari == EINVAL)
{*kepada = Foo_Errno_EPERM; pulangkan 0;}
#endif
pulangan -1;
}
Kod yang berbeza akan dihasilkan jika enum terurus ialah a [Bendera] -dihiasi
penghitungan (untuk mengambil kira bendera bitwise), tetapi ini adalah idea asas.
PENGHANTARAN SENARAI
Lihat http://lists.ximian.com/mailman/listinfo/mono-devel-list untuk maklumat lanjut.
WEB TAPAK
Lihat http://www.mono-project.com untuk maklumat lanjut
cipta-peta-asli(1)
Gunakan create-native-map dalam talian menggunakan perkhidmatan onworks.net