visual utiliza studio que para ordenar indentar codigo code c# serialization

utiliza - ¿Es posible serializar un bloque de código C#?



ordenar codigo visual code (7)

Estoy usando C # con .NET 3.5. ¿Es posible serializar un bloque de código, transmitirlo a otro lugar, deserializarlo y luego ejecutarlo?

Un ejemplo de uso de esto sería:

Action<object> pauxPublish = delegate(object o) { if (!(o is string)) { return; } Console.WriteLine(o.ToString()); }; Transmitter.Send(pauxPublish);

Con algún programa remoto haciendo:

var action = Transmitter.Recieve(); action("hello world");

Mi objetivo final es poder ejecutar código arbitrario en un proceso diferente (que no tiene conocimiento previo del código).


Compile en un ensamble separado, envíe el ensamblaje, haga que el otro proceso lo cargue.

Es posible que desee considerar las implicaciones de seguridad.

Actualización: otra idea sería generar un árbol de expresiones y usar esta biblioteca para serializarlo:

http://www.codeplex.com/metalinq/


En general, eso suena como una muy mala idea y un gran agujero de seguridad.

No quiere que otro proceso ejecute ningún código. Comprenda qué necesita realmente otro proceso y cree un pequeño DSL a su alrededor.


Es un desafío interesante, pero probablemente debas describir por qué quieres hacerlo, ya que hay muchos enfoques diferentes según tu objetivo. Como señala Humpohl, también hay algunos problemas de seguridad bastante serios.

El "código serializado" podría ser simplemente un código fuente o un ensamblaje compilado, según sus requisitos. Probablemente no necesite usar un formato de serialización de código separado.

Si desea generar código de forma dinámica y transmitirlo, puede generar código utilizando CodeDOM y compilarlo. Sin embargo, lo más probable es que no necesites generar un código completamente arbitrario.


¡¡¡SÍ!!!

Hemos hecho esto para un caso muy real de rendimiento. Hacer esto en tiempo de ejecución o usar una DSL no era una opción debido al rendimiento.

Compilamos el código en un ensamblado y extraemos el IL del método. Luego obtenemos todos los metadatos asociados con este método y serializamos todo el problema a través de XML, lo comprimimos y lo ponemos en nuestra base de datos.

En el momento de la rehidratación, reconstituimos el IL con los metadatos utilizando la clase DynamicMethod y lo ejecutamos.

Hacemos esto debido a la velocidad. Tenemos miles de pequeños bloques de código. Desafortunadamente, compilar un bloque de código y ejecutarlo sobre la marcha requiere al menos 250 ms, lo cual es demasiado lento para nosotros. Tomamos este enfoque, y está FUNCIONANDO REALMENTE bien. En tiempo de ejecución, se necesita una cantidad de tiempo inmedible para reconstituir el método y ejecutarlo.

Lo único a lo que hay que prestarle atención ... Los ensambles firmados y ensamblados sin firmar no pueden mezclar los datos del método serializado.


Otra opción es usar el DLR y restringir el código para ejecutar ...


Podría intentar usar IronPython en su proyecto. Es trivial hacer lo que estás preguntando en Python. El código Python podría llamar a sus métodos C #. En cuanto a la seguridad, puede ejecutar el código en un entorno restringido de algún tipo (un ejemplo es RestrictedPython ).


También puede enviarlo como una cadena y luego usar CodeDomProvider para compilarlo, el mismo resultado. Tengo un código de ejemplo de ejemplo así:

using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Reflection; using System.Text; using Microsoft.CSharp; namespace DynamicCodeApplication { class azCodeCompiler { private List<string> assemblies; public azCodeCompiler() { assemblies = new List<string>(); scanAndCacheAssemblies(); } public Assembly BuildAssembly(string code) { CodeDomProvider prov = CodeDomProvider.CreateProvider("CSharp"); string[] references = new string[] { }; // Intentionally empty, using csc.rsp CompilerParameters cp = new CompilerParameters(references) { GenerateExecutable = false, GenerateInMemory = true }; string path = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); cp.CompilerOptions = "@" + path + @"/csc.rsp"; CompilerResults cr = prov.CompileAssemblyFromSource(cp, code); foreach (CompilerError err in cr.Errors) { Console.WriteLine(err.ToString()); } return cr.CompiledAssembly; } public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args) { object returnval = null; Assembly asm = BuildAssembly(code); object instance = null; Type type = null; if (isstatic) { type = asm.GetType(namespacename + "." + classname); } else { instance = asm.CreateInstance(namespacename + "." + classname); type = instance.GetType(); } MethodInfo method = type.GetMethod(functionname); returnval = method.Invoke(instance, args); return returnval; } private void scanAndCacheAssemblies() { /* foreach (string str in Directory.GetFiles(@"C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727")) { if (str.Contains(".dll")) { foreach (string st in str.Split(new char[] { ''//' })) { if (st.Contains(".dll")) { assemblies.Add(st); } } } } * */ assemblies.Add("Accessibility.dll"); assemblies.Add("AspNetMMCExt.dll"); assemblies.Add("cscompmgd.dll"); assemblies.Add("CustomMarshalers.dll"); assemblies.Add("IEExecRemote.dll"); assemblies.Add("IEHost.dll"); assemblies.Add("IIEHost.dll"); assemblies.Add("Microsoft.Build.Conversion.dll"); assemblies.Add("Microsoft.Build.Engine.dll"); assemblies.Add("Microsoft.Build.Framework.dll"); assemblies.Add("Microsoft.Build.Tasks.dll"); assemblies.Add("Microsoft.Build.Utilities.dll"); assemblies.Add("Microsoft.Build.VisualJSharp.dll"); assemblies.Add("Microsoft.CompactFramework.Build.Tasks.dll"); assemblies.Add("Microsoft.JScript.dll"); assemblies.Add("Microsoft.VisualBasic.Compatibility.Data.dll"); assemblies.Add("Microsoft.VisualBasic.Compatibility.dll"); assemblies.Add("Microsoft.VisualBasic.dll"); assemblies.Add("Microsoft.VisualBasic.Vsa.dll"); assemblies.Add("Microsoft.Vsa.dll"); assemblies.Add("Microsoft.Vsa.Vb.CodeDOMProcessor.dll"); assemblies.Add("Microsoft_VsaVb.dll"); assemblies.Add("mscorlib.dll"); assemblies.Add("sysglobl.dll"); assemblies.Add("System.configuration.dll"); assemblies.Add("System.Configuration.Install.dll"); assemblies.Add("System.Data.dll"); assemblies.Add("System.Data.OracleClient.dll"); assemblies.Add("System.Data.SqlXml.dll"); assemblies.Add("System.Deployment.dll"); assemblies.Add("System.Design.dll"); assemblies.Add("System.DirectoryServices.dll"); assemblies.Add("System.DirectoryServices.Protocols.dll"); assemblies.Add("System.dll"); assemblies.Add("System.Drawing.Design.dll"); assemblies.Add("System.Drawing.dll"); assemblies.Add("System.EnterpriseServices.dll"); assemblies.Add("System.Management.dll"); assemblies.Add("System.Messaging.dll"); assemblies.Add("System.Runtime.Remoting.dll"); assemblies.Add("System.Runtime.Serialization.Formatters.Soap.dll"); assemblies.Add("System.Security.dll"); assemblies.Add("System.ServiceProcess.dll"); assemblies.Add("System.Transactions.dll"); assemblies.Add("System.Web.dll"); assemblies.Add("System.Web.Mobile.dll"); assemblies.Add("System.Web.RegularExpressions.dll"); assemblies.Add("System.Web.Services.dll"); assemblies.Add("System.Windows.Forms.dll"); assemblies.Add("System.XML.dll"); assemblies.Add("vjscor.dll"); assemblies.Add("vjsjbc.dll"); assemblies.Add("vjslib.dll"); assemblies.Add("vjslibcw.dll"); assemblies.Add("vjssupuilib.dll"); assemblies.Add("vjsvwaux.dll"); assemblies.Add("vjswfc.dll"); assemblies.Add("VJSWfcBrowserStubLib.dll"); assemblies.Add("vjswfccw.dll"); assemblies.Add("vjswfchtml.dll"); assemblies.Add("Accessibility.dll"); assemblies.Add("AspNetMMCExt.dll"); assemblies.Add("cscompmgd.dll"); assemblies.Add("CustomMarshalers.dll"); assemblies.Add("IEExecRemote.dll"); assemblies.Add("IEHost.dll"); assemblies.Add("IIEHost.dll"); assemblies.Add("Microsoft.Build.Conversion.dll"); assemblies.Add("Microsoft.Build.Engine.dll"); assemblies.Add("Microsoft.Build.Framework.dll"); assemblies.Add("Microsoft.Build.Tasks.dll"); assemblies.Add("Microsoft.Build.Utilities.dll"); assemblies.Add("Microsoft.Build.VisualJSharp.dll"); assemblies.Add("Microsoft.CompactFramework.Build.Tasks.dll"); assemblies.Add("Microsoft.JScript.dll"); assemblies.Add("Microsoft.VisualBasic.Compatibility.Data.dll"); assemblies.Add("Microsoft.VisualBasic.Compatibility.dll"); assemblies.Add("Microsoft.VisualBasic.dll"); assemblies.Add("Microsoft.VisualBasic.Vsa.dll"); assemblies.Add("Microsoft.Vsa.dll"); assemblies.Add("Microsoft.Vsa.Vb.CodeDOMProcessor.dll"); assemblies.Add("Microsoft_VsaVb.dll"); assemblies.Add("mscorlib.dll"); assemblies.Add("sysglobl.dll"); assemblies.Add("System.configuration.dll"); assemblies.Add("System.Configuration.Install.dll"); assemblies.Add("System.Data.dll"); assemblies.Add("System.Data.OracleClient.dll"); assemblies.Add("System.Data.SqlXml.dll"); assemblies.Add("System.Deployment.dll"); assemblies.Add("System.Design.dll"); assemblies.Add("System.DirectoryServices.dll"); assemblies.Add("System.DirectoryServices.Protocols.dll"); assemblies.Add("System.dll"); assemblies.Add("System.Drawing.Design.dll"); assemblies.Add("System.Drawing.dll"); assemblies.Add("System.EnterpriseServices.dll"); assemblies.Add("System.Management.dll"); assemblies.Add("System.Messaging.dll"); assemblies.Add("System.Runtime.Remoting.dll"); assemblies.Add("System.Runtime.Serialization.Formatters.Soap.dll"); assemblies.Add("System.Security.dll"); assemblies.Add("System.ServiceProcess.dll"); assemblies.Add("System.Transactions.dll"); assemblies.Add("System.Web.dll"); assemblies.Add("System.Web.Mobile.dll"); assemblies.Add("System.Web.RegularExpressions.dll"); assemblies.Add("System.Web.Services.dll"); assemblies.Add("System.Windows.Forms.dll"); assemblies.Add("System.XML.dll"); assemblies.Add("vjscor.dll"); assemblies.Add("vjsjbc.dll"); assemblies.Add("vjslib.dll"); assemblies.Add("vjslibcw.dll"); assemblies.Add("vjssupuilib.dll"); assemblies.Add("vjsvwaux.dll"); assemblies.Add("vjswfc.dll"); assemblies.Add("VJSWfcBrowserStubLib.dll"); assemblies.Add("vjswfccw.dll"); assemblies.Add("vjswfchtml.dll"); return; } } }