... | ... | @@ -2,7 +2,7 @@ |
|
|
---
|
|
|
|
|
|
### **P/Invoke**
|
|
|
**P/Invoke(Platform Invocation)**는 **Managed Code**에서 DLL로 구현된 **Unmanaged Code**를 사용할 수 있도록 기능을 제공한다.
|
|
|
**P/Invoke(Platform Invocation)**는 DLL로 구현된 **Unmanaged Code**를 C#과 같은 **Managed Code**에서 사용할 수 있도록 연동과 관련된 기능을 제공한다.
|
|
|
|
|
|
> System.Runtime.InteropServices
|
|
|
|
... | ... | @@ -10,8 +10,8 @@ |
|
|
[DllImport("example.dll", EntryPoint = "example_printInfo", CallingConvention = CallingConvention.Cdecl)]
|
|
|
static extern void printInfo();
|
|
|
```
|
|
|
* **DllImport()**에 DLL 파일명을 지정 후 `static`과 `extern` 키워드를 사용하여 Method를 정의한다.
|
|
|
* **EntryPoint** : Method를 지정하면 다른 이름으로 정의할 수 있다.
|
|
|
* **DllImport()**에 DLL 파일명을 지정하고 `static`과 `extern` 키워드를 사용하여 Method를 정의한다.
|
|
|
* **EntryPoint** : DLL에 포함된 Method를 지정하면 다른 이름으로 Method를 정의할 수 있다.
|
|
|
* **CallingConvention** : Method를 호출하는 데 필요한 규칙을 지정한다. (CallingConvention.Cdecl : 매개변수 사용을 허용)
|
|
|
|
|
|
---
|
... | ... | @@ -74,7 +74,7 @@ Area : 15 |
|
|
| Marshal.FreeHGlobal() | Unmanaged 메모리에 할당된 공간을 해제 |
|
|
|
| Marshal.ReadInt32() | Unmanaged 메모리에서 32bit 부호 있는 정수를 읽음 |
|
|
|
| Marshal.ReadByte() | Unmanaged 메모리에서 byte 형식의 변수를 읽음 |
|
|
|
| Marshal.Copy() | Unmanaged 메모리의 Point를 Managed 형식의 배열에 또는 그 반대로 값을 복사 |
|
|
|
| Marshal.Copy() | Unmanaged 메모리의 Pointer를 Managed 형식의 배열에 또는 그 반대로 값을 복사 |
|
|
|
| Marshal.SizeOf() | Unmanaged 형식의 변수 크기를 byte 단위로 반환 |
|
|
|
|
|
|
#### **예시**
|
... | ... | @@ -122,9 +122,9 @@ public static string StringFromUtf8Ptr(IntPtr ptr) // ptr is null-terminated |
|
|
}
|
|
|
|
|
|
```
|
|
|
* `IntPtr`은 Point를 나타내는 형식이다. 매개변수를 `IntPtr` 형식인 ptr로 받는다.
|
|
|
* `IntPtr`은 Pointer를 나타내는 형식이다. 매개변수를 `IntPtr` 형식인 ptr로 받는다.
|
|
|
* ptr을 `byte` 단위로 읽어서 0이 되기 전까지 len을 증가시켜 문자열의 길이를 구한다.
|
|
|
* Managed byte 배열에 Unmanaged Point 변수에 저장된 값을 지정한 길이만큼 복사한다.
|
|
|
* Managed byte 배열에 Unmanaged Pointer 변수에 저장된 값을 지정한 길이만큼 복사한다.
|
|
|
|
|
|
### **U8Conv.Utf8BytesFromString()**
|
|
|
```
|
... | ... | @@ -136,7 +136,7 @@ public static byte[] Utf8BytesFromString(string s) |
|
|
return buf;
|
|
|
}
|
|
|
```
|
|
|
* Unmanaged 문자열에는 배열의 끝 요소에 0('\0')이 저장되어야 하므로 cnt보다 1 증가한 크기의 byte 배열인 buf를 생성한다.
|
|
|
* Unmanaged 문자열은 배열의 끝 요소에 0('\0')이 저장되어야 하므로 cnt보다 1 증가한 크기의 byte 배열인 buf를 생성한다.
|
|
|
* string 형식의 변수 s를 byte로 Encoding하여 buf에 저장한 후 반환한다.
|
|
|
|
|
|
### **Kai.DisplayStr()**
|
... | ... | @@ -161,7 +161,7 @@ try |
|
|
```
|
|
|
* Unmanaged 메모리에 bufsize+1 크기만큼의 buf를 할당한다.
|
|
|
* 해당 kai ID(id)의 데이터를 string으로 buffer(buf)에 표시한다.
|
|
|
* U8Conv.StringFromUtf8Ptr()에 매개변수로 buf를 넘긴 후 string 형식으로 반환한다.
|
|
|
* buf를 U8Conv.StringFromUtf8Ptr()에 매개변수로 넘긴 후 string 형식으로 반환한다.
|
|
|
|
|
|
---
|
|
|
|
... | ... | @@ -171,7 +171,7 @@ finally |
|
|
Marshal.FreeHGlobal(buf);
|
|
|
}
|
|
|
```
|
|
|
* return 반환 후 Unmanaged 메모리에 할당된 buf를 해제한다.
|
|
|
* return 후 Unmanaged 메모리에 할당된 buf를 해제한다.
|
|
|
|
|
|
### **Kai.CellByName()**
|
|
|
```
|
... | ... | @@ -191,8 +191,8 @@ public static string CellByName(int id, string col_name, int row) |
|
|
}
|
|
|
```
|
|
|
* string 형식의 col_name을 U8Conv.Utf8BytesFromString()의 매개변수로 넘긴 후 byte 배열로 반환하여 col에 저장한다.
|
|
|
* kai_cell_byname()를 사용하여 해당 Kai ID(id)에서 byte 배열(col)의 row 번째 Cell 내용을 반환하여 ptr에 저장한다.
|
|
|
* ptr은 Unmanaged Point이므로 IntPtr 형식으로 저장되어 있을 것이다. 이를 U8Conv.StringFromUtf8Ptr()의 매개변수로 넘긴 후 string 형식으로 반환한다.
|
|
|
* kai_cell_byname()를 사용하여 해당 Kai ID(id)에서 byte 배열(col)의 row 번째 내용을 반환하여 ptr에 저장한다.
|
|
|
* ptr은 Unmanaged Pointer이므로 IntPtr 형식으로 저장되어 있을 것이다. 이를 U8Conv.StringFromUtf8Ptr()의 매개변수로 넘긴 후 string 형식으로 반환한다.
|
|
|
|
|
|
### **Kai.row_howmany()**
|
|
|
```
|
... | ... | @@ -209,7 +209,7 @@ public static extern int row_howmany(int id, out int rows); |
|
|
int kai_row_howmany(int id, int *howmany) { /* 내용 */ }
|
|
|
```
|
|
|
* kai_row_howmany()은 해당 Kai ID(id)에서 howmany의 row 수를 세어 반환하는 Method이다.
|
|
|
* kai_row_howmany()의 선언 부분에는 매개변수 howmamy를 Point로 받아온다. 이를 C#에서 사용하기 위해 정의할 때 `out` 키워드를 사용하여 매개변수를 Call By Reference로 넘겨준다.
|
|
|
* kai_row_howmany()의 선언 부분에는 매개변수 howmamy를 Pointer로 받아온다. 이를 C#에서 사용하기 위해 정의할 때 `out` 키워드를 사용하여 매개변수를 Call By Reference로 넘겨준다.
|
|
|
|
|
|
### **Metic.init(), Metic.Init()**
|
|
|
```
|
... | ... | @@ -253,5 +253,5 @@ void (*conn_cb)(enum metic_status status, int sv_info_kai), |
|
|
void (*login_rsp_cb)(int success, int info_kai)) { /* 내용 */ }
|
|
|
```
|
|
|
* metic_init() 매개변수로 받은 정보를 이용해 metic을 초기화하는 Method이다. 정상적으로 연결되면 1을 반환하고, 실패하면 0을 반환한다.
|
|
|
* 매개변수에서 char 형식의 Point로 선언된 server_ip는 C#에서 string 형식으로 대체할 수 있다. 또한, unsigned short 형식의 server_port도 ushourt로 대체하여 사용한다.
|
|
|
* Function Pointr로 선언된 conn_cb와 login_rsp_cb는 Delegate로 선언된 Connection과 LoginRsp로 대체하여 사용한다. 이와 같은 형식의 Method를 매개변수로 받아서 사용할 수 있다. |
|
|
\ No newline at end of file |
|
|
* 매개변수에서 char 형식의 Pointer로 선언된 server_ip는 C#에서 string 형식으로 대체할 수 있다. 또한, unsigned short 형식의 server_port도 ushourt로 대체하여 사용한다.
|
|
|
* Function Pointer로 선언된 conn_cb와 login_rsp_cb는 Delegate로 선언된 Connection과 LoginRsp로 대체하여 사용한다. 이와 같은 형식의 Method를 매개변수로 받아서 사용할 수 있다. |
|
|
\ No newline at end of file |