- WSOFT Docs
- ブログ
- 共同作成ガイド
-
製品
- 製品
- PCMX
- WSOFTアカウント
- AliceScript
- AliceScript
- 謝辞
- ダウンロード
- Alice(キャラクター)
- AliceScriptのツアー
- Wikiの概要
- APIブラウザー
- APIブラウザー
- Alice
- Alice
- break
- continue
- delay
- do
- exit
- for
- foreach
- function
- if
- import
- include
- lock
- read
- readonly
- return
- string_format
- switch
- try-catch
- using
- while
- write
- Console
- Diagnostics
- Environment
- Alice.Environment
- env_clr_version
- env_commandLine
- env_commandLineArgs
- env_exitCode
- env_expand_environmentVariables
- env_get_environmentVariable
- env_hasShutdownStarted
- env_impl_architecture
- env_impl_location
- env_impl_name
- env_impl_target
- env_impl_version
- env_is64BitOperatingSystem
- env_is64BitProcess
- env_lang_name
- env_lang_version
- env_machineName
- env_newLine
- env_os_platform
- env_os_version
- env_set_environmentVariable
- env_set_exitCode
- Exception
- Interop
- Interpreter
- Alice.Interpreter
- gc_collect
- gc_collectAfterExecute
- gc_getTotalMemory
- interpreter_append_output
- interpreter_append_output
- interpreter_consts
- interpreter_functions
- interpreter_getVariable
- interpreter_globalVariables
- interpreter_name
- interpreter_nameexists
- interpreter_namespaces
- interpreter_process
- interpreter_processfile
- interpreter_reset_variables
- Type
- IO
- Alice.IO
- directory_copy
- directory_create
- directory_create_symbolicLink
- directory_current
- Directory delete
- directory_exists
- directory_get_accessTime
- directory_get_creationTime
- directory_get_directories
- directory_get_entries
- directory_get_files
- directory_get_length
- directory_get_linkTarget
- directory_get_writeTime
- directory_getDirectories
- directory_getFiles
- directory_getLogicalDrives
- directory_getRoot
- directory_move
- directory_set_accessTime
- directory_set_creationTime
- directory_set_creationTime
- file_append_text
- File copy
- file_decrypt
- file_delete
- file_encrypt
- file_exists
- file_get_accessTime
- file_get_creationTime
- file_get_length
- file_get_linkTarget
- file_get_writeTime
- file_move
- file_read_charCode
- file_read_codePage
- file_read_data
- file_read_decrypt
- file_read_text
- file_replace
- file_set_accessTime
- file_set_creationTime
- file_set_creationTime
- file_write_data
- file_write_encrypt
- file_write_text
- path_changeExtension
- path_combine
- path_endsInDirectorySeparator
- path_get_directoryName
- path_get_extension
- path_get_fileName
- path_get_fileNameWithoutExtension
- path_get_fullPath
- path_get_pathRoot
- path_get_randomFileName
- path_get_relativePath
- path_get_tempFileName
- path_get_tempPath
- path_has_extension
- path_isPathFullyQualified
- path_isPathRooted
- path_join
- path_trimEndingDirectorySeparator
- zip_append_file
- zip_createFromDirectory
- zip_extractToDirectory
- Math
- Alice.Math
- math_abs
- math_acos
- math_acosh
- math_asinh
- math_atan
- math_atan2
- math_atanh
- math_bitDecrement
- math_bitIncrement
- math_cbrt
- math_ceiling
- math_clamp
- math_copySign
- math_cos
- math_cosh
- math_E
- math_epsilon
- math_exp
- math_factorial
- math_floor
- math_fusedMultiplyAdd
- math_infinity
- math_isAbsolutelyClose
- math_isFinite
- math_isInfinity
- math_isNaN
- math_isNegativeInfinity
- math_isNormal
- math_isPositiveInfinity
- math_isPrime
- math_isRelativelyClose
- math_isSubNormal
- math_log
- math_max
- math_maxValue
- math_min
- math_minValue
- math_NaN
- math_negativeInfinity
- math_pi
- math_pow
- math_round
- math_sin
- math_sinh
- math_sqrt
- math_tan
- math_tanh
- math_tau
- math_truncate
- Net
- Parsing
- Random
- Regex
- Security
- Threading
- Array
- array
- Add
- AddRange
- All
- Any
- BinarySearch
- Chunk
- Clear
- Contains
- Distinct
- Except
- Exists
- Find
- FindAll
- FindIndex
- FindLast
- FindLastIndex
- First
- Flatten
- Foreach
- IndexOf
- Insert
- InsertRange
- Intersect
- Last
- Length
- Max
- Mean
- Median
- Merge
- Min
- Mode
- OfType
- OrderBy
- OrderByDescending
- Remove
- RemoveAt
- RemoveRange
- Repeat
- Reverse
- Select
- SequenceEqual
- Size
- Skip
- SkipLast
- SkipWhile
- Slice
- Sort
- StdDev
- Sum
- Take
- TakeWhile
- Union
- Variance
- Where
- Bool
- Bytes
- Delegate
- None
- Number
- String
- string
- Chunk
- CodePointAt
- CompareTo
- Contains
- EndsWith
- Equals
- Format
- GetBytes
- Indent
- IndexOf
- Insert
- IsEmptyOrNull
- IsEmptyOrWhiteSpace
- IsNormalized
- Join
- LastIndexOf
- Length
- LengthInTextElements
- Normalize
- PadCenter
- PadLeft
- PadRight
- Remove
- RemoveAt
- Repeat
- Replace
- ReplaceLineEndings
- Split
- SplitLines
- StartsWith
- SubString
- ToLower
- ToLowerInvariant
- ToTitleCase
- ToTitleCaseInvariant
- ToUpper
- ToUpperInvariant
- Trim
- TrimEnd
- TrimStart
- Variable
- Void
- WSOFT
- 変更履歴
- 例外
- 例外
- 0x000 NONE
- 0x001 COULDNT_FIND_FUNCTION
- 0x003 INVALID_OPERAND
- 0x004 COULDNT_FIND_VARIABLE
- 0x005 ITS_RESERVED_NAME
- 0x006 ILLEGAL_IDENTIFIER
- 0x009 INCOMPLETE_ARGUMENTS
- 0x018 VARIABLE_IS_NULL
- 0x019 USER_DEFINED
- 0x01a COULDNT_ADD_PARAMETERS_AFTER_PARMS_KEYWORD
- 0x01b FILE_NOT_FOUND
- 0x01c NAMESPACE_NOT_FOUND
- 0x01d NAMESPACE_NOT_LOADED
- 0x01f TRY_BLOCK_MISSING_HANDLERS
- 0x020 COULDNT_EXECUTE_BLOCK
- 0x021 NEED_BRACKETS
- 0x022 UNNEED_TO_BRACKETS
- 0x031 INDEX_OUT_OF_RANGE
- 0x032 COULDNT_PARSE
- 0x034 NOT_IMPLEMENTED
- 0x043 ARGUMENT_MUST_BE_PASSED_WITH_KEYWORD
- 0x044 ARGUMENT_CANT_USE_WITH_KEYWORD
- 0x04a CASE_BLOCK_MISSING_BREAK
- 0x04b UNKNOWN_ESCAPE_CHAR
- 0x04c ASSERTION_ERROR
- 基本
- Alice in Discord
- 相互運用
- チュートリアル
- ダウンロードセンター
- ほめて.ws
- アイコンメーカー
- WSOFTScript
- Unidet
- WebSailing
- WebSailing
- APIブラウザー
- 更新履歴
- WebSailingNXの更新情報
- NX 81
- NX 83
- NX 104.1
- NX 105
- NX 105.1
- NX 106
- NX 106.1
- NX 106.2
- NX 107
- NX 107.1
- NX 107.2
- NX 108
- NX 109
- NX 110
- NX 110.1
- NX 110.2
- NX 110.3
- NX 111
- NX 111.1
- NX 112
- NX 114
- NX 114.1
- NX 115
- NX 115.1
- NX 116
- NX 116.1
- NX 117
- NX 117.1
- NX 118
- NX 119
- NX 119.1
- NX 120
- NX 120.1
- NX 120.2
- NX 120.3
- NX 120.4
- NX 121
- NX 121.1
- NX 122
- NX 123
- NX 124
- NX 124.1
- NX 125
- NX 126
- NX 126.1
- NX 127
- GL
- NX(レガシー)
- WSPlugin
- チュートリアル
- WSNET
- WSTodon
- WSTube
- Lantana
- 法的資料
-
あみうは
- あみうは
- 新学期が始まりました!
- 恋の相談
- プチコン3号で作ったのは?
- オススメの文庫
- マクドナルド最高!
- ios11β レビュー
- あみうはの歌について
- ついに自分のソフトウェアのホームページができました。
- Windowsタブレットをリセットして起動しなくなった人のために
- PCレスで YouTubeの曲を携帯mp3プレイヤーで聴く(iPhone)
- 食べられないラズベリーパイを買いました。(1)
- ラズベリーパイの下ごしらえ(2)
- 小説始めます~
- 女子がキュンとくる行動ベスト3!!
- MacとWindowsについてあまり知られていない事
- macでできる裏技
- ドコモの格安スマホ「MONO」買っちゃいました☆いい所をいくつか
- 『レビュー』iPhone6sを1年間使い続けて思ったこと
- iPhoneの拡大鏡に関するバクを発見しました。
- iPhoneで圧縮ファイルを作成したり解凍する方法
- Obscura2が今だけ無料!使い方まとめ
- Windowsタブレットがブルースクリーンになった時のメモ
- お知らせ
- 放送部マニュアル
マーシャリング
この記事では、AliceScriptの型と他の言語の型とを相互に変換する手法について説明します。
AliceScriptの型システムと.NETやネイティブの型システムは、厳密には一致しません。 このため、AliceScriptと他の言語との間で相互にやり取りを行う場合にはデータ型の変換を行う必要があります。マーシャリングはこの機能を指します。マーシャリングを使用する最も多くの理由は、他の言語で定義された関数に引数を渡し、その関数の戻り値を受け取るためです。
ほとんどの型は、AliceScriptと他の言語との間に共通するものがあります。 この場合は、単にこれを一対一で変換します。例えば、AliceScriptのBool型は.NETのBoolean型と一対一で対応しています。 しかし、他言語の複数の型がAliceScriptのひとつの型に対応している場合など、一対一の関係で処理できない場合もあります。この場合は、必要に応じて型の範囲を拡大したり、縮小する必要がある場合は範囲チェックを行います。ある型で表されている値が変換先の型では表せない場合、例外が発生します。
マーシャリングは、普段開発者が意識する必要がないように設計されています。 しかし、他の言語との間で相互にデータをやり取りしていて、問題が発生している場合にマーシャリングの手法に関する知識が役に立つ可能性があります。 この記事では、AliceScriptの型と他の言語の型とを相互に変換する手法について説明します。
関数呼び出しの概念
AliceScriptの実装は、他の言語で公開されている関数を使用できるようにするため、自動的に(または、extern
属性のついた関数を定義することで)他言語の関数と対応するAliceScriptの関数を登録します。登録された関数は以下の図のように呼び出します。
.NETのメソッドの場合
ネイティブ関数の場合
上記の図のように、.NETのメソッドを呼び出す場合でもネイティブ関数を呼び出す場合でも、一度.NETのメソッド呼び出しに変換します。このフローはコールバック関数が関係しない限り逆向きには作用しません。このとき、AliceScriptの型を正確に.NETの型に変換します。そのためには変換先の.NETの型を特定する必要があります。
AliceScriptから明示的に他言語で定義された関数を呼び出すためには、この変換先の型を明記する必要があります。 以下に、AliceScriptの型と、対応する型キーワード、対応するネイティブ型を示します。
型キーワード | AliceScriptの型 | .NETの型 | ネイティブ型 |
---|---|---|---|
VOID |
該当なし | System.Void |
Win32のVOID 型 |
BOOL |
bool |
System.Boolean |
Win32のBOOL 型(実体はINT ) |
LPSTR 、LPWSTR 、STRINGBUILDER |
string |
System.Text.StringBuilder |
char* またはchar16_t* (文字コードによる) |
LPTSTR 、LPCSTR 、LPCTSTR 、LPCWSTR 、STRING |
string |
System.String |
const char* またはconst char16_t* (文字コードによる) |
型キーワード | AliceScriptの型 | 条件 | 小数 | .NETの型 | ネイティブ型 |
---|---|---|---|---|---|
INT8 、SCHAR 、SBYTE |
number |
-128~127 | 無視 | System.SByte |
int8_t |
UCHAR 、CHAR 、BYTE 、BOOLEAN |
number |
0~255 | 無視 | System.Byte |
uint8_t |
INT16 、SHORT |
number |
-2,147,483,648~2,147,483,647 | 無視 | System.Int16 |
int16_t |
UINT16 、USHORT 、WORD |
number |
0~4,294,967,295 | 無視 | System.UInt16 |
uint16_t |
INT32 、INT 、LONG32 |
number |
-2,147,483,648~2,147,483,647 | 無視 | System.Int32 |
int32_t |
UINT32 、UINT 、ULONG32 、DWORD |
number |
0~4,294,967,295 | 無視 | System.UInt32 |
uint32_t |
INT64 、LONG 、LONG64 、LONGLONG |
number |
-9,223,372,036,854,775,808~9,223,372,036,854,775,807 | 無視 | System.Int64 |
int64_t |
UINT64 、ULONG 、ULONG64 、ULONGLONG |
number |
0~18,446,744,073,709,551,615 | 無視 | System.UInt64 |
uint64_t |
FLOAT 、SINGLE |
number |
±1.5 x 10−45~±3.4 x 1038 | 有効 | System.Short |
Win32のSINGLE 型 |
DOUBLE |
number |
条件なし | 有効 | System.Double |
Win32のDOUBLE 型 |
HDC 、HWND 、HANDLE 、IntPtr |
number |
32ビットまたは64ビット以内 | 無視 | System.IntPtr |
intptr_t |
UIntPtr |
number |
符号なし32ビットまたは64ビット以内 | 無視 | System.UIntPtr |
uintptr_t |