파일을 만드는 방법에 대한 지침도 없습니다. 일반 CIL을 사용하면 일부 작업을 수행 할 수 없다는 점에주의해야합니다. 소켓 열기, 디스크 쓰기, 화면 그리기 등은 하나의 CIL 명령어로 수행 할 수도없고 이러한 명령어로 완전히 분해 할 수도없는 작업입니다.
의 x86 어셈블리 코드는 PC 스피커를 사용하여 사운드를 재생 할 지침이 없다,하지만 분명히 (안 완전한 예)를 사용하여 수행 할 수 있습니다 : 여기
mov al, 0x36
out 0x43, al
mov ax, 11931
out 0x40, al
mov al, ah
out 0x40, al
의 out
을 작성하는 데 사용할 수 있습니다 CPU 특정 포트 값. 이것은 "외부 세계"와 의사 소통하는 방법입니다. 이 경우 CPU는 가능한 한 코드를 실행하고 해석하며 포트 번호의 의미를 이해합니다. 직렬 포트와 통신하거나 단순히 어딘가에서 전압을 변경할 수도 있지만,이 시점에서 하드웨어를 만나기 때문에 더 이상 "지침"이 없으며 전기 만 제공됩니다.
CIL에는 opcode가 out
이 아닙니다. 매우 안전하지 않고 확인할 수 없기 때문입니다. 대신 (이것은 아마도 사용자가 요구하는 것입니다.) 특정 메소드의 구현 위치를 지정하는 메소드에 대한 코드 구현 속성이 있습니다.
ImplAttr :: = ... | cil | 네이티브 | 런타임
이 속성들은 상호 배타적입니다. 메서드에 포함 된 코드 유형을 지정합니다.
cil은 본문이 cil 코드로 구성되도록 지정합니다. 방법이 추상으로 표기된 경우를 제외하고는 cil을 사용하는 경우 본문 본문을 제공해야한다.
네이티브은 메소드가 생성 된 의 특정 프로세서에 연결된 네이티브 코드를 사용하여 구현되었음을 지정합니다. 네이티브 메서드는 본문이 없어야하며 대신 이 본문을 선언하는 기본 메서드를 참조해야합니다. 일반적으로 CLI의 PInvoke 기능은 고유 메소드를 참조하는 데 사용됩니다.
런타임은 런타임의 메서드 구현이 자동으로 런타임에서 제공되며 주로 대리자 메서드에 사용되도록 지정합니다. (ECMA-335) 방법이 cil
표시
가 CIL의 옵 코드로 구성된 몸을 가져야한다, native
몸 어딘가에 위치한 기본 지침에 있음을 표시하며, runtime
가에 방법을 실행하는 작업을 잎 런타임. 평소와 같이 call
opcode를 사용하여 이러한 메서드를 호출합니다.
이러한 방법의 예 : 어떤 이유
.method assembly hidebysig static pinvokeimpl("kernel32.dll" autochar lasterr winapi bestfit:off)
bool DeleteFile(string path) cil managed preservesig
{
}
는 ILDASM은 ECMA-335에 따른 pinvokeimpl
직접 충돌하는 cil managed
표시. native unmanaged
이어야하며, 왜 ildasm이 대신 이것을 표시하는지 잘 모르겠습니다.
외부 메소드 호출 메커니즘은 P/Invoke, QCall 및 FCall입니다. 그들에 관한 좋은 정보는 here입니다. CIL 코드가 시스템이나 런타임과 상호 작용할 수 있도록 정의 된 유일한 방법입니다.
추상화가 어떻게 작동하는지 이해해야합니다. 컴퓨터는 실제로 아무것도 할 수 없지만 숫자를 더하고, 빼고, 곱하고, 나눕니다. 웹 요청을하는 CLR이 아니라 기본 클래스 라이브러리의 수천 가지 지침이 있습니다. –
Intel/AMD 프로세서에도 "HTTP 요청 작성"명령이 없습니다. 그래서 아무도 실제로 HTTP 요청을 할 수 없습니다. 이제까지. 죄송합니다. 우리는 심지어 그들이 CPU를 가지고 있는지 모르기 때문에 Blackberry를 사용해야합니다. –
"어떻게 CIL이 외부 정보를 얻을 수 있습니까?"좋은 질문입니다. 아마도 이것은 더보기 좋게 수정 될 수 있습니다. – IllidanS4