2011-02-18 3 views
6

대용량 C# 프로젝트의 작은 부분에서 DLR을 사용하고 있는데 IronPython이 문제의 언어입니다..NET DLR 안전 또는 샌드 박스 처리 된 스크립트

시스템의 일부 사용자는 작은 스크립트를 입력하여 동작을 사용자 정의 할 수 있습니다. 제가하고 싶은 것은 부작용없는 순수한 함수 나 어떤 종류의 샌드 박스를 사용하여 그 함수가 바깥의 어떤 것도 만질 수 없도록 제한하는 것입니다.

또한 사용자는 함수 본문 만 입력 할 수 있습니다. 함수 헤더 및 인수 사양은 파이썬 DLR 엔진에 전달되기 전에 자동으로 코드에 미리 지정되므로이를 호출하는 시스템의 C# 측에서 정확히 전달할 args 및 되돌아 오는 것. 사용자는 인수로 제공된 값만을 기반으로 간단한 조작 및 테스트를 수행해야합니다.

이 괜찮 : return (a * 100) > b;

이 확인되지 않습니다 :

delete_file_system(); return (a * 100) > b;는 어떻게 달성 할 수 있는가? 더 적절한 언어 또는 기술 선택이 있습니까?

답변

7

샌드 박스 앱 도메인을 만든 다음 해당 앱 도메인에서 스크립트를 실행하는 방법입니다. 여기에서 샌드 박스 도메인 생성에 대한 지침을 찾을 수 있습니다. http://msdn.microsoft.com/en-us/library/bb763046.aspx

앱 도메인에서 코드를 실행하려면 AppDomain을 허용하는 Python.CreateEngine 오버로드를 사용할 수 있습니다. 그러면 해당 엔진에서 실행되는 모든 코드가 해당 앱 도메인에서 실행됩니다.

사용자 코드를 호스트로 다시 호출하려면 MarshalByRefObject에서 파생 된 클래스를 만들고 액세스하여 콜백 할 수있는 범위에 넣습니다. 통화는 일반 앱 도메인으로 전달되며 평소에 할 수있는 모든 작업을 수행 할 수 있습니다.

ObjectOperations 및 ScriptScope에는 원격 도메인의 개체에 대한 작업을 수행하기 위해 ObjectHandles와 함께 작동하는 클래스가 많이 있습니다.