这是 create-native-map 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
create-native-map - C/C# 映射创建者
概要
创建本地地图 [选项]* 汇编-文件-名称输出-前缀
配置
--autoconf-header=标题
HEADER 是通常与 C 一起使用的语法中的头文件名 的#include
声明,例如 的#include or 的#include “本地.h” .
Autoconf 格式的宏是从包含名称生成的,以及一个 的#include
指令被包裹在一个 #ifdef 块中的 Autoconf 宏
产生 .c 文件中。
例如, --autoconf-header= 将生成代码:
#ifndef HAVE_STDIO_H
#包括
#endif /* ndef HAVE_STDIO_H */
--autoconf-member=成员
指定任何访问 MEMBER 应该包裹在一个 #ifdef 有会员
块。 MEMBER 可以是 字段名 或者 类名 . 字段名
组合。
例如,给定 C# 声明:
[Mono.Unix.Native.Map ("struct dirent")]
结构方向{
公共长 d_off;
}
然后 --autoconf-member=d_off 将生成类似于以下内容的代码:
INT
ToDirent(结构 dirent *from,结构 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 是一个 [DLL 导入] - 标记的方法应该 而不去 生成原型
为了它。
--impl-header=标题
插入一个 的#include 在生成的语句中 .c 文件 HEADER .
例如, --impl-header= 产生
#包括
--impl-macro=宏
插入一个 #定义 在生成的语句中 .c 文件中。 MACRO 可以包含一个 = 至
将宏名称与宏值分开。
例如, --impl-宏=FOO=42 产生
#定义FOO 42
--library=图书馆
创建原型 [DLL 导入] - 引用本机的标记方法
图书馆 图书馆 进入生成的 .h 文件中。
--public-header=标题
插入一个 的#include 在生成的语句中 .h 文件 HEADER .
例如, --public-header= 产生
#包括
--public-macro=宏
插入一个 #定义 在生成的语句中 .h 文件中。 MACRO 可以包含一个 = 至
将宏名称与宏值分开。
例如, --公共宏=FOO=42 产生
#定义FOO 42
--重命名成员=从=到
这用于 从 是 C 宏,因此必须更改才能使用
理智。 所有生成的对托管表示的引用都将使用 TO 代替
of 从 .
例如,给定 C# 声明:
[Mono.Unix.Native.Map ("struct stat")]
结构统计{
公共长 st_atime;
}
和论点 --rename-member=st_atime=st_atime_ , 生成的 .h 文件会
包含:
结构统计{
gint64 st_atime_;
};
(注意更改的字段名称),而生成的 .c 文件将包含:
ToStat(结构 stat *from,结构 Stat *to)
{
to->st_atime_ = from->st_atime;
}
--重命名-命名空间=从=到
默认情况下,C 的“命名空间”(符号前缀)是 C# 命名空间; 内的类型
C# 命名空间 单声道.Unix.本机 将在 C“命名空间”中 Mono_Unix_Native 。 使用
--重命名命名空间 修改默认值,例如 - 改名-
命名空间=Mono.Unix.Native=Mono_Posix .
商品描述
创建本地地图 是针对特定场景的程序:保持紧密的代码
基于 C# 类型在 C 和 C# 之间同步耦合。
平台调用只有在托管代码知道所有的确切类型和布局时才有用
它使用的非托管结构。 在 Windows 上通常是这种情况,但它是 而不去 的情况下
在 Unix 上。 例如, 结构 统计 使用大小不同的类型
平台到平台(甚至基于定义的编译器宏!)。 例如, 关闭_t
在 ILP32 平台上通常是有符号的 32 位整数,但也可能是有符号的 64 位整数
在 LP64 平台上,但也可能是 ILP64 平台上的 32 位有符号整数,如果
_文件偏移位 宏的值为 64。简而言之,Unix 中的一切都是灵活的,
托管代码无法处理这种灵活性。
因此,利基 创建本地地图 :假设托管代码可以定位一个固定的 ABI,
并生成代码以将托管表示“thunk”到相应的本机
陈述。 这需要为 一切 可能因平台而异
编译器标志,来自枚举值 ( 信号总线 在 FreeBSD 上的值为 10,但在 FreeBSD 上为 7
Linux)来构造成员(有多大 关闭_t ?)。
创建本地地图 会检查 汇编文件名 并输出以下文件:
输出前缀.h
包含枚举值、类和结构声明、委托
声明,以及 [DLL 导入] - 标记的方法(来自指定的库
- 图书馆 ) 在程序集中 汇编文件名 .
输出前缀.c
包含枚举和结构转换的实现
功能。
输出前缀.cs
包含一个部分类 本地转换 包含枚举翻译
方法。
输出前缀.xml
为枚举翻译生成 ECMA XML 文档存根
方法 输出前缀.cs .
创建本地地图 主要寻找 地图属性 - 装饰类型,并使用两个
地图属性 特性:
原生类型
包含相应的 C 类型。 只有在应用于类时才有用,
结构和字段。
抑制标志
当在枚举成员上指定时 [旗帜] -修饰的枚举
类型, 禁用 对位屏蔽枚举的普通代码生成器支持
类型。
当位掩码和非位掩码信息存储在
相同类型,位掩码检查不应用于非位掩码
值。 例子: Mono.Unix.Native.FilePermissions.S_IFREG ,这不是一个
位掩码值,而大部分 文件权限 由位掩码值 (
文件权限.S_IRUSR , 文件权限.S_IWUSR 等)。
这款 地图属性 可以在类、结构、委托、字段和
枚举。
代表
委托的代码生成忽略 地图属性.NativeType 财产,以及
生成函数指针 类型定义 最匹配委托声明
到 .h 文件中。
例如,
命名空间 Foo {
[地图]
委托字符串 MyCallback(字符串 s);
}
产生 类型定义 :
typedef char* (*Foo_MyCallback) (const char *s);
类和结构
A [地图] - 修饰的类或结构将在
.h 文件:
[地图]
结构 Foo {
公共国际我;
}
成为
结构 Foo {
公共国际我;
};
如果 地图属性.NativeType 属性被设置,那么转换函数将是
内宣布 .h 文件并在 .c 文件:
命名空间 Foo {
[地图(“结构统计”)]
结构统计{
公共单位 st_uid;
}
}
成为
/* .h 文件 */
结构 Foo_Stat {
无符号整数 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 *from,结构 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返回;
}
对于类,转换函数只会复制类中声明的字段
本身。 父类中声明的字段不会被复制。 (这是因为
创建本地地图 不知道继承是如何在C中实现的。因此
从父类复制字段留给转换的调用者
职能。)
字段 如果字段 (1) 具有 地图属性 属性,并且(2)具有
地图属性.NativeType 属性设置,然后将使用指定的本机类型
用于溢出检查。 例如:
命名空间 Foo {
[地图(“结构统计”)]
结构统计{
[Map("off_t")] public 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 *from,结构 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返回;
}
这对于在转换函数中进行更好的错误检查很有用。
地图属性.NativeType 这是必需的,因为没有其他方法可以知道什么
本机类型是(不解析系统头文件......)。
枚举
为每个成员生成 C 枚举和宏
枚举。 至 和 从 函数也声明在 .h 文件和
在实施 .c 文件中。
例如,
命名空间 Foo {
[地图]
枚举错误{
有效值
}
}
将在 .h 文件:
枚举 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;}
的#else
{错误号 = EINVAL; 返回-1;}
#ENDIF
0返回;
}
INT
Foo_ToErrno(int from,int *to)
{
*到 = 0;
#ifdef EINVAL
如果(来自 == EINVAL)
{*to = Foo_Errno_EPERM; 返回 0;}
#ENDIF
return -1;
}
如果托管枚举是一个,将生成不同的代码 [旗帜] 装饰
枚举(考虑按位标志),但这是基本思想。
邮寄 LISTS
访问 http://lists.ximian.com/mailman/listinfo/mono-devel-list 了解详情。
WEB 站点
访问 http://www.mono-project.com 了解详细信息
创建本地地图(1)
使用 onworks.net 服务在线使用 create-native-map