2010-01-16 7 views
15

현재 .NET 운영 체제를 해킹하여 MS.NET/Mono (이전에는 베어 메탈 만 실행) 위에 올려 놓았으며 작은 걸림돌을 맞았습니다. 내 서비스 인프라와 통신하는 자체 System.Console을 구현해야하며, 1) mscorlib (연결하기가 쉽지 않음)에 연결하지 않고 또는 2) NotQuiteSystem을 사용하지 않고 대체 할 수있는 좋은 방법을 찾을 수 없습니다. 내 교체를위한 네임 스페이스로 인해 호환성이 깨질 수 있습니다.시스템 네임 스페이스의 클래스 바꾸기

그 중 하나를 수행하지 않고도 시스템 클래스를 깨끗하게 대체 할 수있는 메커니즘이 있습니까?

편집 : Mono.Cecil을 사용하여 System.Console에 대한 참조를 Renraku.System.Console 또는 somesuch로 다시 작성하는 것이 좋습니다. 가능한 경우 프레임 워크 내에서 작업하는 것이 좋습니다.

+0

, 단지 TraceListener에서을 구현하는과의 Trace.Write 사용하는 캔트? –

+0

@Rubens Farias : 좋은 아이디어예요. 출력은되지만 입력 후킹, 실제 콘솔에 영향을주는 콘솔 설정 등을 허용하지 않습니다. –

+1

OS에서가 아니라 가상 머신 호스트를 구축하려고하는 것으로 알고 있습니다. –

답변

4

무료 도구 PostSharp을 조사해야합니다. 이 도구를 사용하면 MSIL의 수정을 자동화하여 디자인 타임에 기존 .Net 어셈블리를 변경할 수 있습니다.

PostSharp의 컴파일 시간 짜기에 대한 자세한 내용은 this page을 참조하십시오. (어셈블리가 메모리에로드되기 바로 전에 런타임에 발생하는)로드 타임 위빙에 대한 내용은 this page을 참조하십시오.

런타임 작성 (런타임시 기존 방법 수정)의 경우 LinFu을보십시오.

[페이지에서 제외]

은 ... 동적 관계없이 방법은 가상 또는 가상이 아닌 선언 여부의 어떤 유형에 어떤 방법을 가로 채기 위해 LinFu.AOP를 사용할 수 있습니다. 또한 봉인 된 유형에 선언 된 메소드와 해당 유형에 선언 된 정적 메소드를 동적으로 인터셉트 (및 대체) 할 수 있습니다.

[/ 페이지에서 제외]

특정 문제에
+0

정보를 제공해 주셔서 감사합니다.제 경우에는 완벽하지는 않지만 제가 할 수있는 최선책 인 것 같습니다. –

+0

문제 없습니다. 나는 그것이 트릭을하기를 바란다. –

0

표준 입력과 표준 출력을 리디렉션하려는 경우가 있습니까? 그렇다면 Console.SetIn(TextReader in)Console.SetOut(TextWriter out) 정확히 찾고 있습니다.

다른 방법에 관한 한, 나는 그들이 모든 시점에서 mscorlib을 모두 통과 할 것이라 확신합니다. 그럴 여유가 없다면 결국 콘솔 클래스를 직접 작성할 수도 있습니다.

+0

콘솔에 대한 하위 수준 액세스가 필요합니다 (예 : 색상, 버퍼 크기 등등. 따라서 우리는 전체 클래스를 대체 할 수 있어야합니다. 이 문제를 해결하는 유일한 방법은 Mono.Cecil을 사용하여 참조를 다시 작성하는 것입니다. –

0

제 3 자에 대한 제한 사항으로 system.console에서 전환 할 수 있다고 생각하지 않습니다. 왜 당신이 원한 것을 가지고 새로운 수업을 작성하거나 오픈 소스 자료를 검색하지 않겠습니까?

는 또 하나 개의 대안은 윈도우 파워 쉘을 사용하는 것입니다,하지만 난 그 또한 귀하의 경우

0

에서 작동하지 않습니다 어떻게 생각하는지 콘솔 방법에 indirecting에 대해. 당신이 필요로하는 기능에 함수 포인터를로드하는 반사를 사용하여 당신은 당신이 DoConsoleRead는로드시 DoConsoleRead

를 호출 코드에서

즉를 사용하는 함수의 실제 이름을 제공하는 설정 파일을 가질 수 있습니다 어떤 임의의 함수를 가리 키도록했다.

0

나는 그것이 Properties 시트의 References 노드를 사용하여 수행 될 수 있다고 생각한다. 다음 예를보십시오 : http://www.codeproject.com/KB/mobile/Wm2005Globalization2.aspx. Compact Framework에서 클래스를 "수정"하면 전체 프레임 워크에서 작동하도록 만들 수 있다고 생각하지만 지금 당장 테스트 할 수 있습니다. (직장에서 VS가 없음)

0

OS에서 ROTOR (SSCLI)를 실행하는 방법은 어떻습니까? 가 당신은 또한 전체 소스 코드와 MS .NET와 반사판에 약간의 시간을 보낸 데 기본 OS http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en

에서 추상화를 가지고, 우리 모두는 유일한 원인은 것, 그것은 단단히 WIN 32 API에 바인딩 알고 당신의 OS가 윈도우처럼 보이게되면 새로운 클린 OS가됩니다.

그 외, 재 작성 참조는 실행 가능한 옵션처럼 보입니다.

+0

렌트라가 개발자에게 손을 대면 심각한 쟁점이 될 수 있습니다. 우리 자신의 런타임에서 작업하고 OS를 효과적으로 비 자유롭게 만들 수 없게 만듭니다. OS의 아키텍처로 인해 플랫폼 별 (호스트 된) 기능은 서로 다른 서비스로 분리되어 우리 고유의 스타일을 유지할 수 있습니다. 그것은 참조 재 작성이 그것에 대해 갈 가장 좋은 방법 인 것처럼 보입니다. –

+0

코디, 더 많은 관리 OS를 살펴 보았습니다. 이제 나는 너의 요점을 완전히 본다. 코스모스 (COSMOS)와 모사 (MOSA)가 비슷한 마음을 가진 사람들처럼 보입니다. 당신이 성공하려면 1 인 1 인 'Managed OS'에서 모두 일해야한다는 것에 동의해야합니다. 그것을 퍼뜨리는 작업이 너무 많습니다 (최소 3 개 프로젝트). – Rudi

0

GAC에서 System 클래스를 대체하는 방법은 무엇입니까? Java bootclasspath 스위치가 Java "부트 스트랩"클래스의 위치를 ​​정의합니다. java.lang.Object, java.lang.Exception 등

관련 문제