이것은 Ubuntu Online, Fedora Online, Windows online emulator 또는 MAC OS online emulator와 같은 다양한 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 제공자에서 실행할 수 있는 명령 create-native-map입니다.
프로그램:
이름
create-native-map - C/C# 매핑 생성기
개요
네이티브 맵 만들기 [옵션]* 어셈블리 파일 이름 출력 접두사
옵션
--autoconf-header=헤더
머리글 C에서 일반적으로 사용되는 구문의 헤더 파일 이름입니다. #포함
진술, 예를 들어 #포함 or #포함 "로컬.h" .
포함 이름에서 Autoconf 형식의 매크로가 생성되고 #포함
지시문은 ~로 래핑됩니다. #ifdef Autoconf 매크로를 위한 블록
생성 .c 파일.
예를 들어, --자동설정 헤더= 다음 코드를 생성합니다:
#ifndef가 STDIO_H를 갖습니다.
#포함하다
#endif /* ndef HAVE_STDIO_H */
--autoconf-member=멤버
모든 액세스에 대해 지정 회원 ~안에 싸여져야 한다 #ifdef 멤버가 있습니다
블록. 회원 다음 중 하나일 수 있습니다. 분야 명 또는 클래스 이름 . 분야 명
콤비네이션.
예를 들어, C# 선언은 다음과 같습니다.
[Mono.Unix.Native.Map("struct dirent")]
구조체 Dirent {
공개 long d_off;
}
그때 --autoconf-member=d_off 다음과 유사한 코드가 생성됩니다.
INT
ToDirent(구조체 dirent *from, 구조체 Dirent *to)
{
#ifdef 구조체가 직접 꺼짐
d_off에서->d_off로 = d_off에서->로;
#endif /* ndef HAVE_STRUCT_DIRENT_D_OFF */
}
--네이티브 심볼 제외=심볼
SYMBOL 하는 [Dll 가져오기] -표시된 방법은 다음과 같아야 합니다. 지원 프로토타입을 생성하다
그것을 위해.
--impl-header=헤더
삽입 #포함 생성된 내의 진술 .c ~을위한 파일 머리글 .
예를 들어, --구현 헤더= 생성
#포함
--impl-macro=매크로
삽입 #밝히다 생성된 내의 진술 .c 파일. MACRO 포함 할 수 있습니다 = 에
매크로 이름과 매크로 값을 구분합니다.
예를 들어, --구현 매크로=FOO=42 생성
# 정의 FOO 42
--라이브러리=라이브러리
프로토타입을 만듭니다 [Dll 가져오기] -네이티브를 참조하는 표시된 메서드
도서관 도서관 생성된 것으로 .h 파일.
--public-header=헤더
삽입 #포함 생성된 내의 진술 .h ~을위한 파일 머리글 .
예를 들어, --공개 헤더= 생성
#포함
--public-macro=매크로
삽입 #밝히다 생성된 내의 진술 .h 파일. MACRO 포함 할 수 있습니다 = 에
매크로 이름과 매크로 값을 구분합니다.
예를 들어, --공개-매크로=FOO=42 생성
# 정의 FOO 42
--멤버 이름 변경=FROM=TO
이것은 다음과 같은 경우에 사용됩니다. FROM C 매크로이므로 사용하려면 변경해야 합니다.
건전하게. 관리되는 표현에 대한 모든 생성된 참조는 다음을 사용합니다. ~까지 를 받아야 하는 미국 여행자
of FROM .
예를 들어, C# 선언은 다음과 같습니다.
[Mono.Unix.Native.Map("구조체 통계")]
구조체 Stat {
공개 긴 st_atime;
}
그리고 그 주장 --멤버 이름 변경=st_atime=st_atime_ , 생성된 .h 파일이 될 것입니다
있다:
구조체 Stat {
gint64 시간대_;
};
(변경된 필드 이름 참고) 생성된 .c 파일에는 다음이 포함됩니다:
ToStat(구조체 stat *from, 구조 Stat *to)
{
to->st_atime_ = from->st_atime_;
}
--이름 바꾸기-네임스페이스=FROM=TO
기본적으로 C "네임스페이스"(심볼 접두사)는 C# 네임스페이스입니다.
C# 네임스페이스 모노.유닉스.네이티브 C "네임스페이스"에 있을 것입니다 모노_유닉스_네이티브 . 사용
--이름 바꾸기-네임스페이스 기본값을 수정하려면 예를 들어 --이름 바꾸기-
네임스페이스=Mono.Unix.Native=Mono_Posix .
기술
네이티브 맵 만들기 특정 시나리오를 위한 프로그램입니다. 엄격하게 코드를 유지합니다.
C와 C# 사이에 결합되어 있으며, C# 유형을 기반으로 서로 동기화됩니다.
Platform Invoke는 관리되는 코드가 모든 유형의 정확한 레이아웃을 알고 있는 경우에만 유용합니다.
사용하는 관리되지 않는 구조입니다. 이는 일반적으로 Windows에서 발생하지만 지원 경우
Unix에서. 예를 들어, 구조체 스탯 크기가 다양할 유형을 사용합니다.
플랫폼 간(또는 정의된 컴파일러 매크로에 따라!) 예를 들어, off_t
일반적으로 ILP32 플랫폼에서는 부호 있는 32비트 정수이지만 부호 있는 64비트 정수일 수도 있습니다.
LP64 플랫폼에서는 64비트 부호 있는 정수일 수도 있지만 ILP32 플랫폼에서는 XNUMX비트 부호 있는 정수일 수도 있습니다.
_파일 오프셋 비트 매크로는 값 64를 갖습니다. 간단히 말해서, Unix 내에서는 모든 것이 유연합니다.
관리되는 코드는 그러한 유연성을 처리할 수 없습니다.
따라서 틈새 시장은 네이티브 맵 만들기 : 관리되는 코드가 타겟으로 삼을 수 있는 고정된 ABI를 가정합니다.
관리되는 표현을 해당 네이티브에 "thunk"하는 코드를 생성합니다.
표현. 이것은 다음을 위해 수행되어야 합니다. 모두 플랫폼에 따라 다를 수 있습니다.
컴파일러 플래그, 열거형 값에서 ( 시그버스 FreeBSD에서는 값이 10이지만 7입니다.
Linux)에서 멤버를 구조화하는 방법(크기는 얼마인가) off_t ?).
네이티브 맵 만들기 검사할 것이다 어셈블리 파일 이름 다음 파일을 출력합니다.
출력-접두사.h
열거형 값, 클래스 및 구조체 선언, 대리자 포함
선언 및 [Dll 가져오기] - 표시된 메서드(라이브러리에서 지정)
--도서관 ) 어셈블리 내에서 어셈블리 파일 이름 .
출력-접두사.c
열거형 및 구조 변환 구현을 포함합니다.
기능.
출력-프리픽스.cs
부분 클래스를 포함합니다 네이티브컨버트 열거형 번역을 포함하는
방법.
출력-프리픽스.xml
열거형 변환을 위한 ECMA XML 문서 스텁을 생성합니다.
방법 출력-프리픽스.cs .
네이티브 맵 만들기 주로 찾는다 맵 속성 - 장식된 유형이며 두 가지를 사용합니다.
맵 속성 속성 :
네이티브타입
해당 C 유형을 포함합니다. 클래스에 적용되는 경우에만 유용합니다.
구조와 분야.
플래그 억제
열거 멤버에 지정된 경우 [플래그] - 장식된 열거형
유형, 해제 비트 마스킹 열거를 위한 일반 코드 생성기 지원
유형.
이것은 비트마스크 및 비비트마스크 정보가 저장될 때 유용합니다.
동일한 유형이며 비트마스크가 아닌 경우 비트마스크 검사를 사용하면 안 됩니다.
값. 예: 모노.유닉스.네이티브.파일 사용 권한.S_IFREG , 이것은 아니다
비트 마스크 값은 대부분 파일 권한 비트 마스크 값으로 구성됩니다(
파일 사용 권한.S_IRUSR , 파일 사용 권한.S_IWUSR 등).
The 맵 속성 속성은 클래스, 구조체, 대리자, 필드 등에 지정할 수 있습니다.
열거형.
대표자들
대리자에 대한 코드 생성은 다음을 무시합니다. 맵 속성.네이티브 유형 재산 및
함수 포인터를 생성합니다 형식 정의 대리자 선언과 가장 잘 일치하는 것
로 .h 파일.
예를 들어,
네임스페이스 Foo {
[지도]
대리자 문자열 MyCallback(문자열 s);
}
생성 형식 정의 :
typedef char* (*Foo_MyCallback) (const char *s);
클래스와 구조
A [지도] - 장식된 클래스 또는 구조는 C 구조 선언을 받게 됩니다.
.h 파일 :
[지도]
구조체 Foo {
공공 정수 i;
}
된다
구조체 Foo {
공공 정수 i;
};
경우 맵 속성.네이티브 유형 속성이 설정되면 변환 함수가 실행됩니다.
내에 선언됨 .h 파일 및 파일 내에서 생성됨 .c 파일 :
네임스페이스 Foo {
[지도("구조 통계")]
구조체 Stat {
공개 단위 st_uid;
}
}
된다
/* .h 파일 */
구조체 Foo_Stat {
부호 없는 int st_uid;
};
INT
Foo_FromStat(구조체 Foo_Stat *from, 구조 stat *to);
INT
Foo_ToStat(구조체 stat *to, 구조체 Foo_Stat *to);
/* .c 파일 */
INT
Foo_FromStat(구조체 Foo_Stat *에서, 구조체 stat *에서)
{
memset(to, 0, sizeof(*to);
to->st_uid = from->st_uid로 이동
0가 돌아;
}
INT
Foo_ToStat (구조체 stat *to, 구조체 Foo_Stat *to)
{
memset(to, 0, sizeof(*to);
to->st_uid = from->st_uid로 이동
0가 돌아;
}
클래스의 경우 변환 함수는 클래스에 선언된 필드만 복사합니다.
자체. 부모 클래스에 선언된 필드는 복사되지 않습니다. (이것은
네이티브 맵 만들기 C에서 상속이 어떻게 구현되는지 모릅니다. 따라서
부모 클래스에서 필드를 복사하는 작업은 변환 호출자에게 맡겨집니다.
기능.)
필드 필드(1)에 다음이 있는 경우 맵 속성 속성이며 (2)
맵 속성.네이티브 유형 속성이 설정된 경우 지정된 네이티브 유형이 사용됩니다.
오버플로 검사를 위해. 예를 들어:
네임스페이스 Foo {
[지도("구조 통계")]
구조체 Stat {
[맵("off_t")] public long st_size;
}
}
생성
/* .h 파일 */
구조체 Foo_Stat {
gint64 st_size;
};
INT
Foo_FromStat(구조체 Foo_Stat *from, 구조 stat *to);
INT
Foo_ToStat(구조체 stat *to, 구조체 Foo_Stat *to);
/* .c 파일 */
INT
Foo_FromStat(구조체 Foo_Stat *에서, 구조체 stat *에서)
{
_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 (구조체 stat *to, 구조체 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가 돌아;
}
이는 변환 함수 내에서 오류 검사를 개선하는 데 유용합니다.
맵 속성.네이티브 유형 이것이 필요한 이유는 무엇인지 알 수 있는 다른 방법이 없기 때문입니다.
네이티브 유형은 (시스템 헤더 파일을 구문 분석하지 않고...)입니다.
열거
각 멤버에 대한 C 열거형과 매크로를 생성합니다.
열거. 에 그리고 이와 같은 서비스: 함수는 또한 다음에 선언됩니다. .h 파일 및
에서 구현 .c 파일.
예를 들어,
네임스페이스 Foo {
[지도]
열거형 Errno {
에인발
}
}
다음을 생성합니다. .h 파일 :
열거형 Foo_Errno {
Foo_Errno_EINVAL = 0,
#Foo_Errno_EINVAL을 정의합니다.
};
int Foo_FromErrno(시작 위치: int, 끝 위치: int *);
int Foo_ToErrno(from int, to int *);
그리고 다음을 생성합니다. .c 파일 :
INT
Foo_FromErrno(int from, int *to)
{
*로 = 0;
if (from == Foo_Errno_EPERM)
#ifdef 오류
{*to = 값;}
#그밖에
{errno = EINVAL; -1을 반환합니다.}
#endif
0가 돌아;
}
INT
Foo_ToErrno(int from, int *to)
{
*로 = 0;
#ifdef 오류
if (from == EINVAL)
{*to = Foo_Errno_EPERM; 0을 반환합니다.}
#endif
반환 -1;
}
관리되는 열거형이 다음과 같은 경우 다른 코드가 생성됩니다. [플래그] -훌륭하게 꾸민
열거형(비트 플래그를 설명하기 위한)이 있지만, 이것이 기본 아이디어입니다.
메일링 기울기
방문 http://lists.ximian.com/mailman/listinfo/mono-devel-list 를 참조하세요
WEB 대지
방문 http://www.mono-project.com 자세한 내용은
네이티브 맵 만들기(1)
onworks.net 서비스를 사용하여 create-native-map online을 사용하세요