این دستور create-native-map است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
create-native-map - C/C# Mapping Creator
خلاصه
create-native-map [گزینهها]* ASSEMBLY-FILE-NAME OUPUT-PREFIX
OPTIONS
--autoconf-header=HEADER
HEADER یک نام فایل هدر در نحو است که معمولاً با C استفاده می شود #include
بیانیه، به عنوان مثال #include or #include "local.h" .
یک ماکرو با فرمت Autoconf از نام include تولید می شود و a #include
بخشنامه در یک بسته بندی شده است #ifdef بلوک برای ماکرو Autoconf در
تولید .c فایل.
به عنوان مثال، --autoconf-header= کد را ایجاد می کند:
#ifndef HAVE_STDIO_H
#عبارتند از
#endif /* ndef HAVE_STDIO_H */
--autoconf-member=MEMBER
مشخص کنید که هر گونه دسترسی به عضو باید در یک بسته بندی شود #ifdef HAVE_MEMBER
مسدود کردن. عضو می تواند یکی باشد نام زمینه یا یک نام کلاس . نام زمینه
ترکیبی
به عنوان مثال، با توجه به اعلان C#:
[Mono.Unix.Native.Map ("struct dirent")]
struct Dirent {
عمومی طولانی d_off;
}
سپس --autoconf-member=d_off کدی شبیه به:
INT
ToDirent (struct dirent *از، ساخت Dirent *به)
{
#ifdef HAVE_STRUCT_DIRENT_D_OFF
to->d_off = from->d_off;
#endif /* ndef HAVE_STRUCT_DIRENT_D_OFF */
}
--exclude-native-symbol=SYMBOL
سمبل هست یک [DllImport] روش مشخص شده است که باید نه نمونه اولیه تولید شود
برای آن است.
--impl-header=HEADER
درج a #include بیانیه در تولید شده .c پرونده برای HEADER .
به عنوان مثال، --impl-header= تولید می کند
#عبارتند از
--impl-macro=MACRO
درج a #تعريف كردن بیانیه در تولید شده .c فایل. ماکرو می تواند حاوی یک باشد = به
نام ماکرو را از مقدار ماکرو جدا کنید.
به عنوان مثال، --impl-macro=FOO=42 تولید می کند
#تعریف FOO 42
--library=کتابخانه
ایجاد نمونه های اولیه برای [DllImport] روش های علامت گذاری شده که به بومی ارجاع می دهند
کتابخانه کتابخانه به تولید شده .h فایل.
--public-header=HEADER
درج a #include بیانیه در تولید شده .h پرونده برای HEADER .
به عنوان مثال، --public-header= تولید می کند
#عبارتند از
--public-macro=MACRO
درج a #تعريف كردن بیانیه در تولید شده .h فایل. ماکرو می تواند حاوی یک باشد = به
نام ماکرو را از مقدار ماکرو جدا کنید.
به عنوان مثال، --public-macro=FOO=42 تولید می کند
#تعریف FOO 42
--rename-member=FROM=TO
این زمانی استفاده می شود که از یک ماکرو 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 *از, struct Stat *to)
{
to->st_atime_ = from->st_atime;
}
--rename-namespace=FROM=TO
به طور پیش فرض، فضای نام C (پیشوند نماد) فضای نام C# است. انواع در
فضای نام سی شارپ Mono.Unix.Native در C "فضای نام" خواهد بود Mono_Unix_Native . استفاده از
--rename-namespace برای تغییر پیش فرض، به عنوان مثال --تغییر نام-
namespace=Mono.Unix.Native=Mono_Posix .
شرح
create-native-map یک برنامه برای یک سناریوی خاص است: نگه داشتن کد که به شدت است
بر اساس انواع سی شارپ، بین C و C در هماهنگی با یکدیگر قرار می گیرند.
فراخوانی پلتفرم تنها در صورتی مفید است که کد مدیریت شده انواع و طرح بندی دقیق همه را بداند
ساختارهای مدیریت نشده ای که استفاده می کند. این معمولا در ویندوز وجود دارد، اما اینطور است نه مورد
در یونیکس مثلا، ساختار آمار از انواع با اندازه های متفاوت استفاده می کند
پلتفرم به پلتفرم (یا حتی بر اساس ماکروهای کامپایلر تعریف شده!). مثلا، off_t
معمولاً یک عدد صحیح 32 بیتی امضا شده در پلتفرم های ILP32 است، اما ممکن است یک عدد صحیح 64 بیتی امضا شده باشد.
در پلتفرم های LP64، اما ممکن است یک عدد صحیح امضا شده 64 بیتی در پلتفرم های ILP32 نیز باشد اگر
_FILE_OFFSET_BITS ماکرو دارای مقدار 64 است. به طور خلاصه، همه چیز در یونیکس انعطاف پذیر است.
و کد مدیریت شده نمی تواند با چنین انعطاف پذیری مقابله کند.
بنابراین، طاقچه برای create-native-map : فرض کنید یک ABI ثابت که کد مدیریت شده بتواند هدف قرار دهد،
و کد ایجاد کنید تا نمایش های مدیریت شده را به بومی مربوطه "thunk" کنید
نمایندگی ها این باید برای انجام شود همه چیز که می تواند بین پلتفرم ها و
پرچم های کامپایلر، از مقادیر شمارش ( SIGBUS دارای مقدار 10 در FreeBSD اما 7 در است
لینوکس) برای ساختار اعضا (چقدر بزرگ است off_t ؟).
create-native-map بازرسی خواهد کرد ASSEMBLY-FILE-NAME و خروجی فایل های زیر
OUTPUT-PREFIX.h
حاوی مقادیر شمارش، اعلانات کلاس و ساختار، نماینده
اعلامیه ها و [DllImport] -روش های علامت گذاری شده (از کتابخانه مشخص شده توسط
--کتابخانه ) در داخل مجمع ASSEMBLY-FILE-NAME .
OUTPUT-PREFIX.c
شامل اجرای شمارش و تبدیل ساختار است
توابع.
OUTPUT-PREFIX.cs
شامل یک کلاس جزئی است NativeConvert حاوی ترجمه شمارش
مواد و روشها.
OUTPUT-PREFIX.xml
برای ترجمه شمارش، خردهای مستند ECMA XML را ایجاد می کند
روش ها در OUTPUT-PREFIX.cs .
create-native-map در درجه اول به دنبال MapAttribute انواع تزئین شده، و از دو استفاده می کند
MapAttribute خواص:
NativeType
حاوی نوع C مربوطه است. فقط در صورتی مفید است که در کلاس ها اعمال شود،
ساختارها و زمینه ها
سرکوب پرچم ها
هنگامی که در یک عضو شمارش از a مشخص شده است [پرچم ها] -شمارش تزئین شده
نوع، غیرفعال می کند پشتیبانی از مولد کد معمولی برای شمارش بیت ماسک
انواع.
این زمانی مفید است که اطلاعات بیت ماسک و غیر بیت ماسک در داخل ذخیره می شود
همان نوع، و بررسی بیت ماسک نباید برای غیر بیت ماسک استفاده شود
ارزش های. مثال: Mono.Unix.Native.FilePermissions.S_IFREG ، که یک نیست
مقدار بیت ماسک، در حالی که بسیاری از مجوزهای فایل شامل مقادیر بیت ماسک (
FilePermissions.S_IRUSR , FilePermissions.S_IWUSR ، و غیره).
La MapAttribute ویژگی را می توان بر روی کلاس ها، ساختارها، نمایندگان، فیلدها و
شمارش ها
نمایندگان
تولید کد برای نمایندگان نادیده گرفته می شود MapAttribute.NativeType دارایی و
یک نشانگر تابع تولید می کند typedef که به بهترین وجه با اعلامیه نماینده مطابقت دارد
به .h فایل.
به عنوان مثال،
فضای نام Foo {
[نقشه]
واگذاری رشته MyCallback (رشته s);
}
ایجاد می کند typedef :
typedef char* (*Foo_MyCallback) (const char *s);
کلاس ها و سازه ها
A [نقشه] -کلاس یا ساختار تزئین شده یک اعلان ساختار C در داخل می گیرد
.h فایل:
[نقشه]
struct Foo {
عمومی int i;
}
شود
struct Foo {
عمومی int i;
};
اگر MapAttribute.NativeType ویژگی تنظیم شده است، سپس توابع تبدیل خواهد بود
اعلام شده در داخل .h فایل و ایجاد شده در .c فایل:
فضای نام Foo {
[نقشه ("struct stat")]
ساختار آمار {
عمومی uint st_uid;
}
}
شود
/* فایل h */
struct 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 (struct Foo_Stat *از، struct stat *to)
{
memset (to, 0, sizeof(*to);
to->st_uid = from->st_uid;
0 بازگشت؛
}
INT
Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to)
{
memset (to, 0, sizeof(*to);
to->st_uid = from->st_uid;
0 بازگشت؛
}
برای کلاس ها، توابع تبدیل فقط فیلدهای اعلام شده در کلاس را کپی می کنند
خود فیلدهای اعلام شده در کلاس های والد کپی نمی شوند. (این به دلیل این هست که
create-native-map نمی داند ارث چگونه در C اجرا می شود بنابراین
کپی کردن فیلدها از کلاس های والد به تماس گیرنده تبدیل واگذار می شود
کارکرد.)
فیلدها اگر فیلد (1) دارای این باشد MapAttribute ویژگی، و (2) دارای
MapAttribute.NativeType مجموعه ویژگی، سپس از نوع بومی مشخص شده استفاده خواهد شد
برای بررسی سرریز مثلا:
فضای نام Foo {
[نقشه ("struct stat")]
ساختار آمار {
[نقشه ("off_t")] public long st_size;
}
}
تولید می کند
/* فایل h */
struct 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 (struct Foo_Stat *از، struct stat *to)
{
_cnm_return_val_if_overflow (off_t، from->st_size، -1);
memset (to, 0, sizeof(*to);
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 (to, 0, sizeof(*to);
to->st_size = from->st_size;
0 بازگشت؛
}
این برای بررسی بهتر خطا در توابع تبدیل مفید است.
MapAttribute.NativeType برای این مورد نیاز است زیرا هیچ راه دیگری برای دانستن چیست
نوع بومی آن (بدون تجزیه فایل های هدر سیستم...) است.
شمارش ها
یک شمارش C و ماکروها برای هر یک از اعضای داخل ایجاد می کند
شمارش به و از جانب توابع نیز در اعلام شده است .h فایل و
اجرا شده در .c فایل.
به عنوان مثال،
فضای نام Foo {
[نقشه]
enum Errno {
EINVAL
}
}
موارد زیر را در .h فایل:
enum Foo_Errno {
Foo_Errno_EINVAL = 0،
#define Foo_Errno_EINVAL Foo_Errno_EINVAL
};
int Foo_FromErrno (int from, int *to);
int Foo_ToErrno (int from, int *to);
و موارد زیر را در قسمت ایجاد می کند .c فایل:
INT
Foo_FromErrno (int from, int *to)
{
*تا = 0;
اگر (از == Foo_Errno_EPERM)
#ifdef EINVAL
{*to = EINVAL;}
# دیگر
{errno = EINVAL; بازگشت -1;}
# اندیف
0 بازگشت؛
}
INT
Foo_ToErrno (int from, int *to)
{
*تا = 0;
#ifdef EINVAL
اگر (از == EINVAL)
{*to = Foo_Errno_EPERM; بازگشت 0;}
# اندیف
بازگشت -1 ؛
}
اگر enum مدیریت شده a باشد، کد متفاوتی ایجاد می شود [پرچم ها] تزئین شده
شمارش (برای محاسبه پرچم های بیتی)، اما این ایده اصلی است.
ارسال نامه لیست
بازدید http://lists.ximian.com/mailman/listinfo/mono-devel-list برای جزئیات بیشتر.
WEB سایت
بازدید http://www.mono-project.com برای جزئیات بیشتر
create-native-map(1)
با استفاده از خدمات onworks.net به صورت آنلاین از create-native-map استفاده کنید