2010-02-19 1 views
7

나는 많은 WIN32 API 호출을 사용하고 안전하지 않은 코드가 필요한 프로젝트를 만들고 있습니다. 베스트 프랙티스 관점에서 필자는 주 애플리케이션을 안전하게 유지하면서/unsafe 스위치로 컴파일 된 자체 DLL에이 코드를 격리해야합니까?내 안전 코드를 안전하지 않은 코드와 함께 사용해야합니까?

다른 말로 표현하면 다음과 같습니다./unsafe 스위치로 프로젝트를 컴파일하지 않을 이유가 있습니까? 잠재적 위험이 있습니까?

답변

7

어셈블리는 정의상 .NET에서 독립적으로 버전 관리가 가능한 재배포 가능 코드의 최소 단위입니다. 그러므로 내가 스스로에게 묻는 첫 번째 질문은 "안전하지 않은 코드의 새로운 버전을 만들어 내 응용 프로그램과 독립적으로 배포하려고 할 것인가?"입니다.

대답이 '예'인 경우 꼭 해당 코드를 자체 어셈블리에 넣으십시오.

대답이 아니오이면 다른 요인을 고려하십시오. 예를 들어, "고전적인".NET 보안에서는 같은 appdomain에서 서로 다른 신뢰 수준으로 실행되는 서로 다른 어셈블리를 가질 수 있습니다. (현대의 CLR에서는 시스템이 훨씬 간단합니다. 완전히 신뢰할 수있는 코드 만 있고 다른 모든 것은 신뢰 수준에서 실행됩니다.) 안전하지 않은 코드는 완전히 신뢰할 수 있어야하지만 단순히 호출하는 코드 만 사용해야합니다. 안전하지 않은 코드가 올바른 사용 권한 집합을 나타내는 경우 신뢰도가 떨어질 수 있습니다.

안전 코드가 부분적으로 신뢰되는 상황에 처한 적이 있습니까? 그렇다면 반드시 안전하지 않은 코드를 자체 어셈블리에 넣은 다음이 어셈블리를 완전히 신뢰할 수 있어야한다고 문서화하십시오.

그런 상황이 아니라면 안전하지 않은 코드를 자체 어셈블리에 넣지 않을 것입니다.

그러나 원시 Win32 호출을 단순히 노출하는 것이 아니라 관리되지 않는 코드 위에 유쾌한 관리 객체 모델을 작성하는 경향이 있습니다. 예를 들어, 다른 날 C#에서 강력한 이름 확인 win32 api를 호출해야했지만 클래스의 개인 내부에 모든 불쾌한 interop 세부 정보를 추상화하여 멋지게 노출 한 작은 라이브러리를 작성했습니다.

+2

충분합니다. 나보다 나은 대답. 내가 3 장의 상향 전신을 가지고있을 때까지 기다릴 수 없었으므로 그 메달을 지울 메달을 얻을 수 있었습니까? ;) – pdr

+2

당신이 열등하다고 생각하더라도 잠시 동안 당신의 대답을 남겨 두는 것에는 범죄가 없습니다. – Mykroft

+1

@Mykroft : 개인 프라이드라고 부르십시오. – pdr