dotnet/pinvoke ์‚ฌ์šฉ ํ›„๊ธฐ

์ด๋ฒˆ์— ๊ฐœ๋ฐœํ•˜๋ฉด์„œ P/Invoke๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์ƒ๊ฒจ์„œ ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•˜๋‹ค ์•Œ๊ฒŒ๋œ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.
dotnet ๊ณ„์ •์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๊ณ  pinvoke.net์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฝค ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์œ„ ํŒจํ‚ค์ง€๋Š” Win32 API๋ฅผ ๋‹ท๋„ท์œผ๋กœ ์™„๋ฒฝํžˆ ์˜ฎ๊ธด ๋Š๋‚Œ์ด ๊ฐ•ํ•ด ํ•จ์ˆ˜๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ๊ตฌ์กฐ๋Œ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋Œ์•„๊ฐ€์ง€๋งŒ, dotnet/pinvoke๋Š” ๋ญ”๊ฐ€ ์ž์ฒด์ ์ธ ๊ทœ์น™์„ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ enum ๊ณ„์—ด์ธ๋ฐ c++์—์„œ ์‚ฌ์šฉํ•˜๋˜ enum ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ค์งˆ ์•Š์Šต๋‹ˆ๋‹คโ€ฆ
์ž์ฒด์ ์œผ๋กœ ๋งคํ•‘ํ•ด๋‘” ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š”๋ฐ, ๋ฌธ์„œ๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์ง„ ํŽธ์ด ์•„๋‹ˆ๋ผ ์ด์ชฝ์—์„œ ์‹œ๊ฐ„์„ ๊ฝค ์žก์•„๋จน์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ์•„์ฃผ ์˜ค๋ž˜๋œ API๋“ค์€ ์ž์ฒด์ ์œผ๋กœ ์ •๋ฆฌํ–ˆ๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค
(์ œ๊ฐ€ ์‚ฌ์šฉํ•œ ๊ฒƒ ์ค‘์—์„œ๋Š” SetupApi์—์„œ SetupDiGetDeviceRegistryProperty ํ•จ์ˆ˜๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค).

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ๋‹จ์ ๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ๋‹ท๋„ท์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋„๋ก ๋งŒ๋“  ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
Kernel32์—์„œ WriteFile๊ณผ ReadFile์—์„œ ๋Š๊ผˆ๋Š”๋ฐ, ArraySegment<T>๋กœ ๋Œ€์‘์‹œ์ผœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™•์‹คํžˆ ์ด ๋ถ€๋ถ„์€ ์ข‹์ง€๋งŒโ€ฆ ์ € Win32 ๊ณ„์—ด API์˜ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์›Œ๋‚™ ๋งŽ์•„์„œ ๋ชจ๋“  ์ƒํ™ฉ์— ๋Œ€์‘์„ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ Kernel32์˜ CreateFileํ•  ๋•Œ FILE_FLAG_OVERLAPPED ์†์„ฑ์„ ์ฃผ๋ฉด ํŒŒ์ผ์„ ๋น„๋™๊ธฐ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—ฌ๋Š” ์ž‘์—…์„ ํ•˜๋Š”๋ฐ ์ด๋•Œ๋Š” ์œ„์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ERROR_INVALID_PARAMETER๊ฐ€ ๋œน๋‹ˆ๋‹คโ€ฆ

๊ทธ๋Ÿผ์—๋„ ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ์—์„œ Win32 ๊ณ„์—ด ์„ ์–ธ์ด๋‚˜ ์ˆ˜๋งŽ์€ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฐ ์žฅ์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

8๊ฐœ์˜ ์ข‹์•„์š”