์ด๋ฒ์ ๊ฐ๋ฐํ๋ฉด์ 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 ๊ณ์ด ์ ์ธ์ด๋ ์๋ง์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋ด์ง ์์๋ ๋๋ ๊ฒ์ ๋งค์ฐ ํฐ ์ฅ์ ์ผ๋ก ์๊ฐํฉ๋๋ค.