2016-09-15 2 views
1

정적 클래스에서 상속하거나 상속 할 수 없다는 것과 그 이유는 알고 있습니다. 그건 분명하다.런타임시 정적 클래스를 바꾸는 방법

정적 클래스를 내 정적 클래스로 바꾸는 방법에 대한 조언을 찾고 있습니다. 어떤 hackish 또는 야생 시도하십시오.

기본적으로 게임용 MOD를 작성하고 있습니다. 게임 작성자가 특히 하나의 클래스를 작성하는 방식으로 정적으로 설정하고 구현을 구현합니다. 그래서 우리가 이걸로 우리 자신의 DLL을 작성할 때 픽셀 그리드에서 계산을 실행하는 유일한 방법은 그의 코드가 정적 클래스에서이 특정한 계산을 호출 할 때입니다. 두 클래스 모두 정적이지만 하나만 변경하면됩니다.

그에게 좋지만 다른 일을 계산하고 더 멋지게 만들고 싶습니다. ILspy를 사용하여 기본 게임의 정적 클래스에있는 모든 코드를 볼 수 있으므로 복사하여 붙여 넣을 수 있으며 두 개 또는 세 개의 행만 수정하면됩니다.

하지만 이제 게임 핵심 클래스를 핵 만들고 핵을 유일한 구현으로 만들고 싶습니다.

정적 클래스를 호출하기 전에 런타임에 해당 정적 클래스를 강제로 바꾸고 싶습니다. 내 모드를로드 한 후 어떻게해야합니까? 정적 클래스를 교체하는 방법이 있어야합니까?

모든 메서드를 이전 DLL로 내 메서드를 내 DLL로 리디렉션하는 프록시 DLL을 만드는 방법에 대해 읽었지 만 게이머가 핵심 게임 DLL을 대체해야하므로 그 사람이 내 모드에서 수행하는 작업을 말하는 것보다 더 끔직합니다. . 내 모드를 사용하지 않는 경우이 모드에 대한 구현을 변경하고 있습니다. 그것은 더 합리적입니다.

+0

이 진입 점 어셈블리의 정적 클래스 인 IL 해킹 강한라는 이름의 어셈블리입니다 제안 ? –

+0

모두 예 및 예 – ppumkin

+0

그게 더 어렵습니다. –

답변

1

몇 가지 옵션을 shimming에 대한 예제를 포함

  • 검토 원래 개발자는 말했다 방법 게임을 수정할 때

  • 코드를 얻으려면 JustDecompile과 같은 것을 사용할 수 있습니다.

  • 사용 페이크 above

  • 자신의 어셈블리로 호출 자신의 어셈블리를 생성하고 동적으로

+0

감사합니다. 우리가 원하는 어떤 방식 으로든 게임을 디피하십시오. 문제는 그리드에서 라이트 타일을 생성하기위한 그의 구현이 틱에서 정적 클래스를 호출한다는 것입니다. 여기서 UntiyGameEngine은 그래프를 호출합니다. 그가 인터페이스를 만들었거나 문학 작품의 대표자에게 코드 한 줄을 허용했다면 쉽습니다. 내 자신의 어셈블리를 만드는 것은 모든 플레이어가 MOD로드 연습을 따르는 대신 MOD 어셈블리를로드하는 대신 어셈블리에서 게임을 "해킹"해야한다는 것을 의미합니다. 가짜는 엔터프라이즈 전용입니다. – ppumkin

+0

RhinoMock이 똑같은 일을 할 것이라고 생각하십니까? – ppumkin

+0

아니요, 조롱하는 프레임 워크가 작동하지 않습니다. 타입 분해능에 과부하가 걸리는 것이 필요합니다. 또는 실행하려는 코드를 삽입하는 메소드를 다시 작성하십시오. –

1

이이 질문에 아주 가까이 보인다 :이 게시물에 대한 답변의 Can I redirect .NET method calls to a new method at runtime?

한 것은 도서관에서 찾고 제안은 본론과 비슷한 것 같다 Moles수도 도움라고

Moles를 사용하면 모든 .NET 메서드를 대리자로 바꿀 수 있습니다. Moles는 정적 또는 비 가상 메서드를 지원합니다.

+0

'Fakes'를 사용하여 해당 페이지를 재검색합니다. 작동합니까? 그것을 들어 보지 못했습니다 – ppumkin

+0

프리미엄/엔터프라이즈 전용 가짜. 그러나 가짜를 대체 할 것 같은 RhinoMocks가 있습니다. – ppumkin

2

소스에 대한 액세스 권한이 없으므로 직접 수정할 수 없다고 가정합니다.

주로 테스트 용이기 때문에 Microsoft 가짜를 사용해야합니다. 원래 작성자의 dll을 기반으로 가짜 어셈블리를 만들 수 있으며 원하는 형식 만 재정의 할 수 있습니다. 심지어 정적 클래스를 재정의 (override)하는 것을 지원합니다. 다시 말하지만, 나는 반드시 당신이 이것을해야한다고 말하지는 않지만, 당신은 할 수 있습니다.
여기 테스트중인 코드를 분리하는 페이지입니다, 그것은 ... 정적 클래스 (날짜 시간) https://msdn.microsoft.com/en-us/library/hh549175.aspx

+0

최신 소스 코드를 가지고 있지는 않지만, 게임 작성자가 최신 버전을 판매하기를 원하지만, DLL의 90 %를 노출하고 자신의 비밀 소스를 숨 깁니다. 그래서 내가 바꾸고 싶은 100 % 코드를 볼 수 있습니다. 따라서 정확하게 복사 한 경우에도 런타임에서 Static으로 그의 정적을 대체하려고합니다. – ppumkin

+0

Heheh. 감사. 나는이 가짜 물건을 들여다 볼 것입니다. 나는 3 년 전에 어떤 방법 으로든 알아야 할 것 같은데. :) – ppumkin

+0

Visual Studio Enterprise를 구하십니까? :(noooooooo - MSDN에 이미 충분한 돈을 지불하지 않은 것처럼 .. dammit – ppumkin

관련 문제