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); }
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)); }