นี่คือคำสั่ง create-native-map ที่สามารถเรียกใช้ในผู้ให้บริการโฮสติ้งฟรีของ OnWorks โดยใช้เวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
create-native-map - ผู้สร้างแผนที่ C/C#
เรื่องย่อ
สร้างแผนที่พื้นเมือง [ตัวเลือก]* ASSEMBLY-FILE-NAME OUPUT-PREFIX
OPTIONS
--autoconf-header=HEADER
HEADER เป็นชื่อไฟล์ส่วนหัวในรูปแบบที่มักใช้กับ C #include
คำสั่งเช่น #include or #include "local.h" .
มาโครที่จัดรูปแบบ Autoconf สร้างขึ้นจากชื่อที่รวมและa #include
คำสั่งถูกห่อด้วย a #ifdef บล็อกสำหรับแมโคร Autoconf ภายใน
สร้าง .c ไฟล์
ตัวอย่างเช่น --autoconf-header= จะสร้างรหัส:
#ifndef HAVE_STDIO_H
#รวม
#endif /* ndef HAVE_STDIO_H */
--autoconf-member=สมาชิก
ระบุว่าการเข้าถึงใด ๆ สมาชิก ควรห่อภายใน a #ifdef มี_สมาชิก
กลุ่ม สมาชิก สามารถเป็นได้ทั้ง a ชื่อสนาม หรือ ชื่อคลาส . ชื่อสนาม
การรวมกัน
ตัวอย่างเช่น จากการประกาศ C#:
[Mono.Unix.Native.Map ("struct dirent")]
โครงสร้าง Dirent {
d_off ยาวสาธารณะ;
}
แล้วก็ --autoconf-สมาชิก=d_off จะสร้างรหัสคล้ายกับ:
int
ToDirent (struct dirent *จาก, struct Dirent *เป็น)
{
#ifdef HAVE_STRUCT_DIRENT_D_OFF
ถึง ->d_off = จาก ->d_off;
#endif /* ndef HAVE_STRUCT_DIRENT_D_OFF */
}
--exclude-native- symbol=SYMBOL
SYMBOL คือ [นำเข้า Dll] -ทำเครื่องหมายวิธีที่ควร ไม่ มีการสร้างต้นแบบ
สำหรับมัน
--impl-ส่วนหัว = ส่วนหัว
แทรกไฟล์ #include คำสั่งภายในที่สร้างขึ้น .c ไฟล์ HEADER .
ตัวอย่างเช่น --impl-header= สร้าง
# รวม
--impl-มาโคร=MACRO
แทรกไฟล์ #กำหนด คำสั่งภายในที่สร้างขึ้น .c ไฟล์ มาโคร สามารถมี = ไปยัง
แยกชื่อมาโครออกจากค่ามาโคร
ตัวอย่างเช่น --impl-มาโคร=FOO=42 สร้าง
#กำหนด FOO 42
--library=ห้องสมุด
สร้างต้นแบบสำหรับ [นำเข้า Dll] -ทำเครื่องหมายวิธีการซึ่งอ้างอิงถึงภาษาพื้นเมือง
ห้องสมุด ห้องสมุด ในการสร้าง .h ไฟล์
--public-header=HEADER
แทรกไฟล์ #include คำสั่งภายในที่สร้างขึ้น .h ไฟล์ HEADER .
ตัวอย่างเช่น --public-header= สร้าง
# รวม
--public-macro=MACRO
แทรกไฟล์ #กำหนด คำสั่งภายในที่สร้างขึ้น .h ไฟล์ มาโคร สามารถมี = ไปยัง
แยกชื่อมาโครออกจากค่ามาโคร
ตัวอย่างเช่น --public-มาโคร=FOO=42 สร้าง
#กำหนด FOO 42
--เปลี่ยนชื่อสมาชิก=FROM=TO
ใช้เมื่อ จาก เป็นมาโคร C จึงต้องปรับเปลี่ยนเพื่อใช้งาน
มีสติ การอ้างอิงที่สร้างขึ้นทั้งหมดไปยังการแสดงที่มีการจัดการจะใช้ TO แทน
of จาก .
ตัวอย่างเช่น จากการประกาศ C#:
[Mono.Unix.Native.Map ("สถิติโครงสร้าง")]
โครงสร้างสถิติ {
สาธารณะ st_atime ยาว;
}
และข้อโต้แย้ง --เปลี่ยนชื่อสมาชิก=st_atime=st_atime_ , ที่สร้างขึ้น .h ไฟล์จะ
ประกอบด้วย:
โครงสร้างสถิติ {
gint64 st_atime_;
};
(สังเกตชื่อฟิลด์ที่เปลี่ยนแปลง) ในขณะที่ไฟล์ที่ถูกสร้างขึ้น .c ไฟล์จะมี:
ToStat (สถิติโครงสร้าง *จาก, โครงสร้างสถิติ *เป็น)
{
ถึง ->st_atime_ = จาก ->st_atime;
}
--เปลี่ยนชื่อ-namespace=FROM=TO
โดยค่าเริ่มต้น C "เนมสเปซ" (สัญลักษณ์นำหน้า) คือเนมสเปซ C#; ประเภทภายใน
C# เนมสเปซ โมโน Unix พื้นเมือง จะอยู่ใน C "เนมสเปซ" Mono_Unix_Native . ใช้
--เปลี่ยนชื่อ-เนมสเปซ เพื่อแก้ไขค่าเริ่มต้นเช่น --เปลี่ยนชื่อ-
เนมสเปซ=Mono.Unix.Native=Mono_Posix .
DESCRIPTION
สร้างแผนที่พื้นเมือง เป็นโปรแกรมสำหรับสถานการณ์เฉพาะ: การเก็บรหัสที่แน่น
ควบคู่ระหว่าง C และ C# ที่ซิงค์กันตามประเภท C#
Platform Invoke จะมีประโยชน์ก็ต่อเมื่อโค้ดที่ได้รับการจัดการรู้ประเภทและเลย์เอาต์ที่แน่นอนของทั้งหมด
โครงสร้างที่ไม่มีการจัดการที่ใช้ ซึ่งมักจะเป็นกรณีนี้ใน Windows แต่ก็เป็น ไม่ กรณี
บนยูนิกซ์ ตัวอย่างเช่น, โครงสร้าง stat ทำให้ใช้ประเภทที่มีขนาดแตกต่างกันไปตั้งแต่
แพลตฟอร์มต่อแพลตฟอร์ม (หรือแม้แต่ตามมาโครคอมไพเลอร์ที่กำหนดไว้!) ตัวอย่างเช่น, ปิด_t
มักจะเป็นจำนวนเต็ม 32 บิตที่ลงนามบนแพลตฟอร์ม ILP32 แต่อาจเป็นจำนวนเต็ม 64 บิตที่ลงนาม
บนแพลตฟอร์ม LP64 แต่อาจเป็นจำนวนเต็มที่ลงนาม 64 บิตบนแพลตฟอร์ม ILP32 หาก
_FILE_OFFSET_BITS มาโครมีค่า 64 กล่าวโดยย่อทุกอย่างมีความยืดหยุ่นภายใน Unix
และโค้ดที่ได้รับการจัดการไม่สามารถจัดการกับความยืดหยุ่นดังกล่าวได้
ดังนั้น ช่องสำหรับ สร้างแผนที่พื้นเมือง : ถือว่า ABI คงที่ซึ่งโค้ดที่ได้รับการจัดการสามารถกำหนดเป้าหมายได้
และสร้างรหัสเพื่อ "thunk" การแสดงที่มีการจัดการไปยังเจ้าของภาษาที่เกี่ยวข้อง
การเป็นตัวแทน ต้องทำเพื่อ ทุกอย่าง ที่สามารถเปลี่ยนแปลงได้ระหว่างแพลตฟอร์มและ
แฟล็กคอมไพเลอร์ จากการแจงนับค่า ( ซิกบัส มีค่า 10 บน FreeBSD แต่ 7 บน
Linux) เป็นโครงสร้างสมาชิก (ใหญ่แค่ไหน ปิด_t ?)
สร้างแผนที่พื้นเมือง จะตรวจสอบ ASSEMBLY-FILE-NAME และส่งออกไฟล์ต่อไปนี้:
เอาท์พุท-คำนำหน้าh
ประกอบด้วยค่าการแจงนับ ประกาศคลาสและโครงสร้าง delegate
ประกาศและ [นำเข้า Dll] -marked method (จากไลบรารีที่ระบุโดย
--ห้องสมุด ) ภายในสภา ASSEMBLY-FILE-NAME .
เอาท์พุท-PREFIX.c
ประกอบด้วยการดำเนินการแจงนับและการแปลงโครงสร้าง
ฟังก์ชั่น
เอาท์พุท-PREFIX.cs
ประกอบด้วยคลาสบางส่วน NativeConvert ที่มีการแปลแจงนับ
วิธีการ
เอาต์พุต-PREFIX.xml
สร้างสตับเอกสาร ECMA XML สำหรับการแปลแจงนับ
วิธีการใน เอาท์พุท-PREFIX.cs .
สร้างแผนที่พื้นเมือง ส่วนใหญ่มองหา แผนที่แอตทริบิวต์ -ตกแต่งแบบและใช้สองอย่าง
แผนที่แอตทริบิวต์ คุณสมบัติ:
ประเภทพื้นเมือง
ประกอบด้วยประเภท C ที่สอดคล้องกัน มีประโยชน์เฉพาะเมื่อนำไปใช้กับชั้นเรียน
โครงสร้างและสนาม
ระงับธง
เมื่อระบุไว้ในสมาชิกการแจงนับของ a [ธง] - การแจงนับตกแต่ง
ประเภท, คนพิการ ตัวสร้างโค้ดปกติรองรับการแจงนับบิตมาสก์
ประเภท
สิ่งนี้มีประโยชน์เมื่อข้อมูลบิตมาสก์และไม่ใช่บิตมาสก์ถูกเก็บไว้ภายใน
ชนิดเดียวกัน และไม่ควรใช้การตรวจสอบบิตมาสก์สำหรับไม่ใช่บิตมาสก์
ค่านิยม ตัวอย่าง: Mono.Unix.Native.FilePermissions.S_IFREG ซึ่งไม่ใช่
ค่าบิตมาสก์ในขณะที่ส่วนใหญ่ สิทธิ์ของไฟล์ ประกอบด้วยค่าบิตมาสก์ (
สิทธิ์ของไฟล์S_IRUSR , สิทธิ์ของไฟล์S_IWUSR ฯลฯ )
พื้นที่ แผนที่แอตทริบิวต์ สามารถระบุแอตทริบิวต์ในคลาส โครงสร้าง ผู้รับมอบสิทธิ์ ฟิลด์ และ
การแจงนับ
ผู้ได้รับมอบหมาย
การสร้างรหัสสำหรับผู้ได้รับมอบหมายละเว้น MapAttribute.NativeType ทรัพย์สินและ
สร้างตัวชี้ฟังก์ชัน พิมพ์ดีฟ ที่ตรงกับคำประกาศของผู้แทนที่สุด
เข้าไปใน .h ไฟล์
ตัวอย่างเช่น
เนมสเปซฟู {
[แผนที่]
ผู้รับมอบสิทธิ์สตริง MyCallback (สตริง s);
}
สร้าง พิมพ์ดีฟ :
typedef ถ่าน* (*Foo_MyCallback) (const ถ่าน *s);
ชั้นเรียนและโครงสร้าง
A [แผนที่] - คลาสหรือโครงสร้างที่ตกแต่งแล้วจะได้รับการประกาศโครงสร้าง C ภายใน
.h ไฟล์:
[แผนที่]
โครงสร้างฟู {
int สาธารณะ i;
}
จะกลายเป็น
โครงสร้างฟู {
int สาธารณะ i;
};
ถ้า MapAttribute.NativeType ตั้งค่าคุณสมบัติแล้ว ฟังก์ชั่นการแปลงจะเป็น
ประกาศภายใน .h ไฟล์และสร้างขึ้นภายใน .c ไฟล์:
เนมสเปซฟู {
[แผนที่ ("สถิติโครงสร้าง")]
โครงสร้างสถิติ {
uint สาธารณะ st_uid;
}
}
จะกลายเป็น
/* ไฟล์ .h */
โครงสร้าง Foo_Stat {
int ที่ไม่ได้ลงชื่อ st_uid;
};
int
Foo_FromStat (struct Foo_Stat *จาก, struct stat *เป็น);
int
Foo_ToStat (สถิติโครงสร้าง *เป็น, sxtruct Foo_Stat *เป็น);
/* ไฟล์ .c */
int
Foo_FromStat (struct Foo_Stat *จาก, struct stat *เป็น)
{
memset (ถึง, 0, sizeof(*to);
ถึง ->st_uid = จาก ->st_uid;
0 กลับ;
}
int
Foo_ToStat (สถิติโครงสร้าง *เป็น, sxtruct Foo_Stat *เป็น)
{
memset (ถึง, 0, sizeof(*to);
ถึง ->st_uid = จาก ->st_uid;
0 กลับ;
}
สำหรับคลาส ฟังก์ชันการแปลงจะคัดลอกเฉพาะฟิลด์ที่ประกาศในคลาส
ตัวเอง. ฟิลด์ที่ประกาศในคลาสพาเรนต์จะไม่ถูกคัดลอก (นี้เป็นเพราะ
สร้างแผนที่พื้นเมือง ไม่ทราบว่าการสืบทอดในค. ดังนั้น
การคัดลอกฟิลด์จากคลาสพาเรนต์จะถูกปล่อยไปยังผู้เรียกของการแปลง
ฟังก์ชั่น.)
ฟิลด์ ถ้าฟิลด์ (1) มี แผนที่แอตทริบิวต์ คุณลักษณะและ (2) มี
MapAttribute.NativeType ชุดคุณสมบัติ จากนั้นจะใช้ประเภทเนทีฟที่ระบุ
สำหรับการตรวจสอบน้ำล้น ตัวอย่างเช่น:
เนมสเปซฟู {
[แผนที่ ("สถิติโครงสร้าง")]
โครงสร้างสถิติ {
[แผนที่ ("off_t")] สาธารณะแบบยาว st_size;
}
}
สร้าง
/* ไฟล์ .h */
โครงสร้าง Foo_Stat {
gint64 st_size;
};
int
Foo_FromStat (struct Foo_Stat *จาก, struct stat *เป็น);
int
Foo_ToStat (สถิติโครงสร้าง *เป็น, sxtruct Foo_Stat *เป็น);
/* ไฟล์ .c */
int
Foo_FromStat (struct Foo_Stat *จาก, struct stat *เป็น)
{
_cnm_return_val_if_overflow (off_t, from->st_size, -1);
memset (ถึง, 0, sizeof(*to);
ถึง ->st_size = จาก ->st_size;
0 กลับ;
}
int
Foo_ToStat (สถิติโครงสร้าง *เป็น, sxtruct Foo_Stat *เป็น)
{
_cnm_return_val_if_overflow (gint64, จาก->st_size, -1);
memset (ถึง, 0, sizeof(*to);
ถึง ->st_size = จาก ->st_size;
0 กลับ;
}
ซึ่งมีประโยชน์สำหรับการตรวจสอบข้อผิดพลาดที่ดีขึ้นภายในฟังก์ชันการแปลง
MapAttribute.NativeType จำเป็นสำหรับสิ่งนี้เพราะไม่มีทางอื่นที่จะรู้ว่าอะไร
ประเภทเนทีฟคือ (โดยไม่ต้องแยกวิเคราะห์ไฟล์ส่วนหัวของระบบ...)
การแจงนับ
สร้างการแจงนับ C และมาโครสำหรับสมาชิกแต่ละตัวภายใน
การแจงนับ ไปยัง และ จาก ฟังก์ชั่นยังประกาศใน .h ไฟล์และ
ดำเนินการใน .c ไฟล์
ตัวอย่างเช่น
เนมสเปซฟู {
[แผนที่]
แจกแจง Errno {
ไอน์วาล
}
}
จะสร้างสิ่งต่อไปนี้ใน .h ไฟล์:
enum Foo_Errno {
ฟู_เออร์โน_อีอินวาล = 0,
#กำหนด Foo_Errno_EINVAL Foo_Errno_EINVAL
};
int Foo_FromErrno (จาก int, int *to);
int Foo_ToErrno (int จาก int *to);
และสร้างสิ่งต่อไปนี้ใน .c ไฟล์:
int
Foo_FromErrno (int จาก int *to)
{
*ถึง = 0;
ถ้า (จาก == Foo_Errno_EPERM)
#ifdef ไอน์วาล
{*ถึง = EINVAL;}
#อื่น
{errno = EINVAL; กลับ -1;}
#เอนดิฟ
0 กลับ;
}
int
Foo_ToErrno (int จาก int *to)
{
*ถึง = 0;
#ifdef ไอน์วาล
ถ้า (จาก == EINVAL)
{*ถึง = Foo_Errno_EPERM; คืนค่า 0;}
#เอนดิฟ
กลับ -1;
}
รหัสที่แตกต่างกันจะถูกสร้างขึ้นหาก enum ที่มีการจัดการคือ a [ธง] - ตกแต่ง
การแจงนับ (เพื่อพิจารณาแฟล็กระดับบิต) แต่นี่เป็นแนวคิดพื้นฐาน
การส่งจดหมาย รายการ
เยี่ยมชมร้านค้า http://lists.ximian.com/mailman/listinfo/mono-devel-list เพื่อดูรายละเอียด
เว็บ เว็บไซต์
เยี่ยมชมร้านค้า http://www.mono-project.com สำหรับรายละเอียดเพิ่มเติม
สร้างแผนที่พื้นเมือง(1)
ใช้ create-native-map ออนไลน์โดยใช้บริการ onworks.net