Connecting Tech Pros Worldwide Help | Site Map

possible to execute code contained in a string ?

John Grandy
Guest
 
Posts: n/a
#1: Nov 17 '05
Is there any way in C# to mimic the T-SQL EXEC() command (which runs a
string as if it was in-line T-SQL code) ?



Mohammad
Guest
 
Posts: n/a
#2: Nov 17 '05

re: possible to execute code contained in a string ?


Do you mean that you want a C# method that would take a string
containing some C# code and then execute it? Or do you mean you want a
C# method that would take an SQL command as a string and execute
against a database?

John Grandy
Guest
 
Posts: n/a
#3: Nov 17 '05

re: possible to execute code contained in a string ?


The former.


"Mohammad" <m@abdulfatah.net> wrote in message
news:1112057880.276639.5950@o13g2000cwo.googlegrou ps.com...[color=blue]
> Do you mean that you want a C# method that would take a string
> containing some C# code and then execute it? Or do you mean you want a
> C# method that would take an SQL command as a string and execute
> against a database?
>[/color]


Mohammad
Guest
 
Posts: n/a
#4: Nov 17 '05

re: possible to execute code contained in a string ?


Short answer is no, there's isn't a built in function in C# that would
evaluate a C# expression stored in a string.

Long answer is still no, but it can be done. You basically have two
choices: use classes in the System.Reflection.Emit namespace to
implement this functionality yourself, or write your own mini
interpreter to parse and execute the subset of the C# expression
languange that you are interested in. You might want to use the ANTLR
parser generator(http://www,antlr.org/). I have used it once before,
and I found it to be quite impressive.

Be forewarned though, both options would constitute an act of
self-flagellation and loathing unlike any other. So, unless you
absolutely must have this functionality, or if you have some very
sinister sins that you want to repent, then don't do it!

geoffblanduk_nospam@yahoo.co.uk
Guest
 
Posts: n/a
#5: Nov 17 '05

re: possible to execute code contained in a string ?


There's plenty of scripting languages out there that you could
integrate into your C# application to do this - such as Perl (and
probably VBA?).

That might suit your goals?

Ludovic SOEUR
Guest
 
Posts: n/a
#6: Nov 17 '05

re: possible to execute code contained in a string ?


That's possible : have a look to System.CodeDom and System.CodeDom.Compiler.

I have found an example I wrote few months ago :
assume 'usingList' is an arraylist with all using statement (without using
keyword, "System.Xml" for example)
assume 'importList' is an arraylist with all dll name that are necessary for
compilation ("system.dll" for example)
assume 'source' is the source code you want to compile
assume 'classname' is the name of the class you want to compile
assume 'methodname' is the name of the method

Have a look to the following code :
---------------------------------------
//Create method
CodeMemberMethod pMethod = new CodeMemberMethod();
pMethod.Name = methodname;
pMethod.Attributes = MemberAttributes.Public;
pMethod.Parameters.Add(new
CodeParameterDeclarationExpression(typeof(string[]),"boxes"));
pMethod.ReturnType=new CodeTypeReference(typeof(bool));
pMethod.Statements.Add(new CodeSnippetExpression(@"
bool result=true;
try {
"+source+@"
} catch {
result=false;
}
return result;
"));

//Crée la classe
CodeTypeDeclaration pClass = new
System.CodeDom.CodeTypeDeclaration(classname);
pClass.Attributes = MemberAttributes.Public;
pClass.Members.Add(pMethod);

//Crée le namespace
CodeNamespace pNamespace = new CodeNamespace("myNameSpace");
pNamespace.Types.Add(pClass);
foreach(string sUsing in usingList) pNamespace.Imports.Add(new
CodeNamespaceImport(sUsing));

//Create compile unit
CodeCompileUnit pUnit = new CodeCompileUnit();
pUnit.Namespaces.Add(pNamespace);

//Make compilation parameters
CompilerParameters pParams = new
CompilerParameters((string[])importList.ToArray(typeof(string)));
pParams.GenerateInMemory = true;

//Compile
CompilerResults pResults=(new
CSharpCodeProvider()).CreateCompiler().CompileAsse mblyFromDom(pParams,pUnit)
;
if (pResults.Errors != null && pResults.Errors.Count>0) {
foreach(CompilerError pError in pResults.Errors)
MessageBox.Show(pError.ToString());
result =
pResults.CompiledAssembly.CreateInstance("myNameSp ace."+classname);
}
---------------------------------------

for an example,
if 'usingList' equals {"System.Text.RegularExpressions"}
if 'importList' equals {"System.dll"}
if 'classname' equals "myClass"
if 'methodName' equals "myMethod"
if 'source' equals "
string pays=@"ES
FR
EN
"
Regex regex=new Regex(@"^[A-Za-z]{2}$");
result=regex.IsMatch(boxes[0]);
if (result) {
regex=new Regex(@"^"+boxes[0]+@".$",RegexOptions.Multiline);
result=regex.Matches(pays).Count!=0;
}

then, the code that will be compiled will be the following :

using System.Text.RegularExpressions;
namespace myNameSpace {
public class myClass {
public bool myMethod(string[] boxes) {
bool result=true;
try {
string pays=@"ES
FR
EN
"
Regex regex=new Regex(@"^[A-Za-z]{2}$");
result=regex.IsMatch(boxes[0]);
if (result) {
regex=new Regex(@"^"+boxes[0]+@".$",RegexOptions.Multiline);
result=regex.Matches(pays).Count!=0;
}
} catch {
result=false;
}
return result;
}
}
}

---------------------------------------------------

Hope it helps,

Ludovic Soeur.




"John Grandy" <johnagrandy-at-yahoo-dot-com> a écrit dans le message de
news:O1xRF6$MFHA.2136@TK2MSFTNGP14.phx.gbl...[color=blue]
> The former.
>
>
> "Mohammad" <m@abdulfatah.net> wrote in message
> news:1112057880.276639.5950@o13g2000cwo.googlegrou ps.com...[color=green]
> > Do you mean that you want a C# method that would take a string
> > containing some C# code and then execute it? Or do you mean you want a
> > C# method that would take an SQL command as a string and execute
> > against a database?
> >[/color]
>
>[/color]


Closed Thread