internal static void ChangePlatform(ref ReLogic.OS.Platform platform)
        {
            Type type;

            switch (Environment.OSVersion.Platform)
            {
            case PlatformID.Unix:
                type = typeof(ReLogic.OS.Platform).Assembly.GetType(IsRunningOnMac() ? "ReLogic.OS.OsxPlatform" : "ReLogic.OS.LinuxPlatform");
                break;

            case PlatformID.Win32NT:
                type = typeof(ReLogic.OS.Platform).Assembly.GetType("ReLogic.OS.WindowsPlatform");
                break;

            default:
                throw new NotSupportedException();
            }

            platform = (ReLogic.OS.Platform)Activator.CreateInstance(type);
        }
Пример #2
0
        public override void Run()
        {
            ReLogic.OS.Platform temp           = null;
            var changePlatformMethodDefinition = SourceDefinition.MainModule.Import(Method(() => Callbacks.PlatformConstructorCallback.ChangePlatform(ref temp)));

            var field        = Field(() => ReLogic.OS.Platform.Current);
            var cctor        = Type <ReLogic.OS.Platform>().Methods.Single(m => m.Name == ".cctor");
            var instructions = cctor.Body.Instructions;

            if (instructions?.Count != 3 || instructions[1].OpCode != OpCodes.Stsfld || instructions[1].Operand != field)
            {
                throw new NotSupportedException("Could not patch Platform..cctor()");
            }

            var processor = cctor.Body.GetILProcessor();

            processor.Body.Instructions.Clear();

            processor.Append(Instruction.Create(OpCodes.Ldsflda, field));
            processor.Append(Instruction.Create(OpCodes.Call, changePlatformMethodDefinition));
            processor.Append(Instruction.Create(OpCodes.Ret));
        }