Exemplo n.º 1
0
        T LoadCode <T>(string scriptText, string scriptFile, params object[] args) where T : class
        {
            //Debug.Assert(false);
            if (!DisableReferencingFromCode)
            {
                ReferenceAssembliesFromCode(scriptText);
            }

            if (this.IsDebug)
            {
                //compile script and proxy as two separate actions

                //fin the exact class name of the script by test compiling it and browsing the assembly
                Assembly testAsm    = CompileCode(scriptText, scriptFile);
                Type     scriptType = AsmBrowser.FindFirstScriptUserType(testAsm);

                this.ReferenceAssemblyOf <T>();

                string proxyTypeName = "";
                string proxyClass    = scriptType.BuildAlignToInterfaceCode <T>(out proxyTypeName, false);
                string parentClass   = scriptType.FullName.Split('+').First(); // the full name is "Submission#0+Script"
                proxyClass = proxyClass.Replace(parentClass + ".", "");        //Compiler cannot compile the full name Submission#0.Script so convert it into short name Script
                string separator = Environment.NewLine + "// start of user code" + Environment.NewLine;

                Assembly scriptAsm = CompileCode(proxyClass + separator + scriptText, scriptFile);

                scriptType = AsmBrowser.FindFirstScriptUserType(scriptAsm, scriptType.Name);
                var proxyType = AsmBrowser.FindFirstScriptUserType(scriptAsm, proxyTypeName);

                var scriptObject = Activator.CreateInstance(scriptType, args);
                var proxyObject  = Activator.CreateInstance(proxyType, new object[] { scriptObject });

                return((T)proxyObject);
            }
            else
            {
                //compile script and proxy as two separate actions
                var      scriptComp    = CSharpScript.Create(scriptText, CompilerSettings).RunAsync().Result;
                var      scriptAsmName = scriptComp.Script.GetCompilation().AssemblyName;
                Assembly scriptAsm     = AppDomain.CurrentDomain.GetAssemblies().First(a => a.FullName.StartsWith(scriptAsmName, StringComparison.OrdinalIgnoreCase));

                var  scriptObject = scriptAsm.CreateObject("*", args);
                Type scriptType   = scriptObject.GetType();

                this.ReferenceAssemblyOf <T>();
                string type        = "";
                string proxyClass  = scriptObject.BuildAlignToInterfaceCode <T>(out type, false);
                string parentClass = scriptType.FullName.Split('+').First(); //Submission#0+Script
                proxyClass = proxyClass.Replace(parentClass + ".", "");      //Compiler cannot compile Submission#0.Script so convert it into Script

                var      proxyComp    = scriptComp.ContinueWithAsync(proxyClass).Result;
                var      proxyAsmName = proxyComp.Script.GetCompilation().AssemblyName;
                Assembly proxyAsm     = AppDomain.CurrentDomain.GetAssemblies().First(a => a.FullName.StartsWith(proxyAsmName, StringComparison.OrdinalIgnoreCase));

                var proxyObject = proxyAsm.CreateObject("*", new object[] { scriptObject });

                return((T)proxyObject);
            }
        }
Exemplo n.º 2
0
        //creates instance of a Type from underying assembly
        public object CreateInstance(string typeName)
        {
            if (asmBrowser == null)
            {
                if (asmFile == null)
                {
                    throw new Exception("Assembly name (asmFile) was not set");
                }

                workingDir = Path.GetDirectoryName(asmFile);
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandler);
                asmBrowser = new AsmBrowser(Assembly.LoadFrom(asmFile));
            }
            return(asmBrowser.CreateInstance(typeName));
        }
Exemplo n.º 3
0
        public object Invoke(object obj, string methodName, params object[] list)
        {
            if (asmBrowser == null)
            {
                if (asmFile == null)
                {
                    throw new Exception("Assembly name (asmFile) was not set");
                }

                workingDir = Path.GetDirectoryName(asmFile);
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandler);
                asmBrowser = new AsmBrowser(Assembly.LoadFrom(asmFile));
            }
            return(asmBrowser.Invoke(obj, methodName, list));
        }
Exemplo n.º 4
0
		//creates instance of a Type from underying assembly
		public object CreateInstance(string typeName)
		{
			if (asmBrowser == null)
			{
				if (asmFile == null)
					throw new Exception("Assembly name (asmFile) was not set");

				workingDir = Path.GetDirectoryName(asmFile);
				AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandler);
				asmBrowser = new AsmBrowser(Assembly.LoadFrom(asmFile));
			}
			return asmBrowser.CreateInstance(typeName);
		}
Exemplo n.º 5
0
		public object Invoke(object obj, string methodName, params object[] list)
		{
			if (asmBrowser == null)
			{
				if (asmFile == null)
					throw new Exception("Assembly name (asmFile) was not set");

				workingDir = Path.GetDirectoryName(asmFile);
				AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandler);
				asmBrowser = new AsmBrowser(Assembly.LoadFrom(asmFile));
			}
			return asmBrowser.Invoke(obj, methodName, list);	
		}