Last active
January 23, 2020 21:45
-
-
Save burque505/d5938ad682e8b5bcfc9a7b6723ed1014 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; This code is just an adaption of code by | |
;; @Code4FunVienna as listed | |
;; at https://forum.robin-language.org/t/howto-use-scripts-in-scripts/365 | |
;; PLEASE VIST THIS THREAD FOR USE INSTRUCTIONS! | |
;; | |
;; Here we use AutoHotkey and its CLR.ahk library to compile the code | |
;; listed in the variable 'csharp'. | |
;; | |
;; For more on AutoHotkey and CLR, please visit this thread: | |
;; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4633 | |
;; You'll obviously need AutoHotkey installed | |
;; (https://www.autohotkey.com to download) | |
;; and the CLR.ahk code listed at | |
;; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4633 | |
;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
csharp= | |
( | |
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace RobinMerge | |
{ | |
class Program | |
{ | |
static List<string> Includes = new List<string>(); | |
static string OutFilename = string.Empty; | |
static void Main(string[] args) | |
{ | |
if (args.Length != 2) | |
{ // If both file arguments are not given, display usage | |
Console.WriteLine("Usage: RobinMerge <main.robin> <output.robin>"); | |
} | |
else | |
{ | |
OutFilename = args[1]; | |
using (StreamWriter w = new StreamWriter(OutFilename)) | |
{ | |
ProcessFile(args[0], w); | |
} | |
} | |
} | |
private static void ProcessFile(string filename, StreamWriter w) | |
{ | |
string line; | |
using (var reader = new System.IO.StreamReader(filename)) | |
{ | |
while ((line = reader.ReadLine()) != null) | |
{ | |
if (line.Trim().StartsWith("include")) | |
{ | |
string[] splitParts = line.Split('"'); | |
if (splitParts.Length == 3) | |
{ // valid include found | |
if (!Includes.Contains(splitParts[1])) | |
{ | |
Includes.Add(splitParts[1]); | |
ProcessFile(splitParts[1], w); | |
} | |
} | |
} | |
else | |
{ // normal line -> add to output | |
w.WriteLine(line); | |
} | |
} | |
} | |
} | |
} | |
} | |
) | |
asm := CLR_CompileC#(csharp,"System.dll|System.Collections.dll|System.IO.dll|System.Linq.dll|System.Threading.Tasks.dll", 0, "RobinMerge.exe") | |
FileDelete, RobinMerge.pdb ; We delete a .pdb file we won't need. | |
ExitApp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ========================================================== | |
; .NET Framework Interop | |
; https://autohotkey.com/boards/viewtopic.php?t=4633 | |
; ========================================================== | |
; | |
; Author: Lexikos | |
; Version: 1.2 | |
; Requires: AutoHotkey_L v1.0.96+ | |
; | |
CLR_LoadLibrary(AssemblyName, AppDomain=0) | |
{ | |
if !AppDomain | |
AppDomain := CLR_GetDefaultDomain() | |
e := ComObjError(0) | |
Loop 1 { | |
if assembly := AppDomain.Load_2(AssemblyName) | |
break | |
static null := ComObject(13,0) | |
args := ComObjArray(0xC, 1), args[0] := AssemblyName | |
typeofAssembly := AppDomain.GetType().Assembly.GetType() | |
if assembly := typeofAssembly.InvokeMember_3("LoadWithPartialName", 0x158, null, null, args) | |
break | |
if assembly := typeofAssembly.InvokeMember_3("LoadFrom", 0x158, null, null, args) | |
break | |
} | |
ComObjError(e) | |
return assembly | |
} | |
CLR_CreateObject(Assembly, TypeName, Args*) | |
{ | |
if !(argCount := Args.MaxIndex()) | |
return Assembly.CreateInstance_2(TypeName, true) | |
vargs := ComObjArray(0xC, argCount) | |
Loop % argCount | |
vargs[A_Index-1] := Args[A_Index] | |
static Array_Empty := ComObjArray(0xC,0), null := ComObject(13,0) | |
return Assembly.CreateInstance_3(TypeName, true, 0, null, vargs, null, Array_Empty) | |
} | |
CLR_CompileC#(Code, References="", AppDomain=0, FileName="", CompilerOptions="") | |
{ | |
return CLR_CompileAssembly(Code, References, "System", "Microsoft.CSharp.CSharpCodeProvider", AppDomain, FileName, CompilerOptions) | |
} | |
CLR_CompileVB(Code, References="", AppDomain=0, FileName="", CompilerOptions="") | |
{ | |
return CLR_CompileAssembly(Code, References, "System", "Microsoft.VisualBasic.VBCodeProvider", AppDomain, FileName, CompilerOptions) | |
} | |
CLR_StartDomain(ByRef AppDomain, BaseDirectory="") | |
{ | |
static null := ComObject(13,0) | |
args := ComObjArray(0xC, 5), args[0] := "", args[2] := BaseDirectory, args[4] := ComObject(0xB,false) | |
AppDomain := CLR_GetDefaultDomain().GetType().InvokeMember_3("CreateDomain", 0x158, null, null, args) | |
return A_LastError >= 0 | |
} | |
CLR_StopDomain(ByRef AppDomain) | |
{ ; ICorRuntimeHost::UnloadDomain | |
DllCall("SetLastError", "uint", hr := DllCall(NumGet(NumGet(0+RtHst:=CLR_Start())+20*A_PtrSize), "ptr", RtHst, "ptr", ComObjValue(AppDomain))), AppDomain := "" | |
return hr >= 0 | |
} | |
; NOTE: IT IS NOT NECESSARY TO CALL THIS FUNCTION unless you need to load a specific version. | |
CLR_Start(Version="") ; returns ICorRuntimeHost* | |
{ | |
static RtHst := 0 | |
; The simple method gives no control over versioning, and seems to load .NET v2 even when v4 is present: | |
; return RtHst ? RtHst : (RtHst:=COM_CreateObject("CLRMetaData.CorRuntimeHost","{CB2F6722-AB3A-11D2-9C40-00C04FA30A3E}"), DllCall(NumGet(NumGet(RtHst+0)+40),"uint",RtHst)) | |
if RtHst | |
return RtHst | |
EnvGet SystemRoot, SystemRoot | |
if Version = | |
Loop % SystemRoot "\Microsoft.NET\Framework" (A_PtrSize=8?"64":"") "\*", 2 | |
if (FileExist(A_LoopFileFullPath "\mscorlib.dll") && A_LoopFileName > Version) | |
Version := A_LoopFileName | |
if DllCall("mscoree\CorBindToRuntimeEx", "wstr", Version, "ptr", 0, "uint", 0 | |
, "ptr", CLR_GUID(CLSID_CorRuntimeHost, "{CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}") | |
, "ptr", CLR_GUID(IID_ICorRuntimeHost, "{CB2F6722-AB3A-11D2-9C40-00C04FA30A3E}") | |
, "ptr*", RtHst) >= 0 | |
DllCall(NumGet(NumGet(RtHst+0)+10*A_PtrSize), "ptr", RtHst) ; Start | |
return RtHst | |
} | |
; | |
; INTERNAL FUNCTIONS | |
; | |
CLR_GetDefaultDomain() | |
{ | |
static defaultDomain := 0 | |
if !defaultDomain | |
{ ; ICorRuntimeHost::GetDefaultDomain | |
if DllCall(NumGet(NumGet(0+RtHst:=CLR_Start())+13*A_PtrSize), "ptr", RtHst, "ptr*", p:=0) >= 0 | |
defaultDomain := ComObject(p), ObjRelease(p) | |
} | |
return defaultDomain | |
} | |
CLR_CompileAssembly(Code, References, ProviderAssembly, ProviderType, AppDomain=0, FileName="", CompilerOptions="") | |
{ | |
if !AppDomain | |
AppDomain := CLR_GetDefaultDomain() | |
if !(asmProvider := CLR_LoadLibrary(ProviderAssembly, AppDomain)) | |
|| !(codeProvider := asmProvider.CreateInstance(ProviderType)) | |
|| !(codeCompiler := codeProvider.CreateCompiler()) | |
return 0 | |
if !(asmSystem := (ProviderAssembly="System") ? asmProvider : CLR_LoadLibrary("System", AppDomain)) | |
return 0 | |
; Convert | delimited list of references into an array. | |
StringSplit, Refs, References, |, %A_Space%%A_Tab% | |
aRefs := ComObjArray(8, Refs0) | |
Loop % Refs0 | |
aRefs[A_Index-1] := Refs%A_Index% | |
; Set parameters for compiler. | |
prms := CLR_CreateObject(asmSystem, "System.CodeDom.Compiler.CompilerParameters", aRefs) | |
, prms.OutputAssembly := FileName | |
, prms.GenerateInMemory := FileName="" | |
, prms.GenerateExecutable := SubStr(FileName,-3)=".exe" | |
, prms.CompilerOptions := CompilerOptions | |
, prms.IncludeDebugInformation := true | |
; Compile! | |
compilerRes := codeCompiler.CompileAssemblyFromSource(prms, Code) | |
if error_count := (errors := compilerRes.Errors).Count | |
{ | |
error_text := "" | |
Loop % error_count | |
error_text .= ((e := errors.Item[A_Index-1]).IsWarning ? "Warning " : "Error ") . e.ErrorNumber " on line " e.Line ": " e.ErrorText "`n`n" | |
MsgBox, 16, Compilation Failed, %error_text% | |
return 0 | |
} | |
; Success. Return Assembly object or path. | |
return compilerRes[FileName="" ? "CompiledAssembly" : "PathToAssembly"] | |
} | |
CLR_GUID(ByRef GUID, sGUID) | |
{ | |
VarSetCapacity(GUID, 16, 0) | |
return DllCall("ole32\CLSIDFromString", "wstr", sGUID, "ptr", &GUID) >= 0 ? &GUID : "" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment