当前位置:首页 » 编程软件 » 动态编译传参

动态编译传参

发布时间: 2023-04-29 12:09:41

Ⅰ 如何用C#动态编译,执行代码

如何用C#动态编译、执行代码

在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。

一、CSharpCodeProvider
提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。

CreateCompiler():获取编译器的实例。

二、ICodeCompiler
定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。

CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。

三、CompilerParameters
表示用于调用编译器的参数。

ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。

四、CompilerResults
表示从编译器返回的编译结果。

CompiledAssembly:获取或设置以编译的程序集,Assembly类型。

五、Assembly
就是程序集了(不知道如何描述了)。

大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;using System.CodeDom;
using System.CodeDom.Compiler;using System.Text;

namespace ConsoleApplication1
{ public class Program
{ static void Main(string[] args)
{ // 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); // 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true; // 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode()); if (cr.Errors.HasErrors)
{
Console.WriteLine("编译错误:"); foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
} else
{ // 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");

Console.WriteLine(objMI.Invoke(objHelloWorld, null));
}

Console.ReadLine();
} static string GenerateCode()
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public string OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return \"Hello world!\";");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}"); string code = sb.ToString();
Console.WriteLine(code);
Console.WriteLine(); return code;
}
}
}

Ⅱ 在java代码中实现动态编译java文件

importjavax.tools.*;
importjava.io.*;
/**
*@authorhardneedl
*/
finalpublicclassMyCompile{

/**
*@paramargs命令行参数只有1个,即待编译的源代码文件的绝对路径
*@throwsFileNotFoundException
*/
publicstaticvoidmain(String...args)throwsFileNotFoundException{

JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();
intr=compiler.run(null,null,null,args[0]);
System.out.println(r==0?"成功":"失败");
}

}

Ⅲ C++动态哭编译问题,如何通过参数列表传出参数

应修改一下函数GetCardTye的设计实现
short GetCardTye(char ** name,char** type)
{
*name="你好";
*type="会员卡";
return 0;
}
测试用例如下(使用方法也应根据函数修改):
int main (void)
{
char *name="";
char *type="";
GetCardTye(&name,&type);
printf("name:%s,type:%s\n",name,type);
getchar();
return 0;
}
在vs2010下测试通过。

错误原因分析:就是传值调用和传址调用的问题。
你想修改的实际上是一个指针的值,那么传入的就应该是这仿轮个指针的地址。备大信实际上你传入的是指针的值,那么在GetCardTye函数内部对指针的修改是无法传递回调用它的函数的。你采用的函数调用方式是传值调用,该方式只能作为传入参数;要想将输入参数承仿枣载输出值,必须得将该参数按照传址调用的方式使用。

Ⅳ 动态库编译详解

当前类介绍:upper.c ( upper) 依赖于 bottom.c(play)

说明:当执行可执行程序的时候,需要去/lib. /user/lib下和LD_LIBRARY_PATH下寻找so.并不会在当前目录下寻找.

所以执行./main.out会报错.如下:

解决方案:指定.so运行搜寻路径

1.-Wl,-rpath ./mypath 加入参数,并且将libplay.so 到./mypath目录下.

2.设置LD_LIBRARY_PATH,指定目录.

说明:指定了-Wl,-rpath, 设置LD_LIBRARY_PATH也是可以生效的.并不是说只会去-Wl,-rpath下寻找.

首先生成一个bottom.so,然后用upper.so去依赖bottom.so, 然后main.c 再去依赖upper.so.

说明:这里编译的时候直接出错,是因为没有指定搜寻路径,所以无法通过编译.

解决编译问题方案.

1.我们依然采用LD_LIBRARY_PATH的方式可以解决编译和运行的问题.

2.生成libplay的时候,直接指定-Wl,-rpath 给libbottom.可以解决编译不通过的问题.

3.依赖所有库

依赖所有库只能解决编译问题,无法处理运行的路径.

另一种思路:我们在执行main.out的时候 执行-Wl,-rpath.并不在生成libplay的时候指定,看下是否正常.

由此可见,-Wl,-rpath 只能针对直接依赖的libplay.so指定了路径,但是libbottom还是无法查找到 .但是LD_LIBRARY是可以的.

rpath只能对直接依赖的so设置搜寻目录,并且可以设置所有依赖的编译路径.

总结: 解决编译问题,在生成libplay的时候指定-Wl,-rpath运行路径,或者设置LD_LIBRARAY_PATH,都可以解决这个问题.

当我们现在拥有的so包含一个直接依赖的so和很多间接依赖的so,但是没有设置rpath.所以是不能直接依赖主so进行编译和运行的.

为了通过编译:

1.在只链接主so的情况下可以去设置rpath或者LD_LIBRARY_PATH.

2.或者链接所有so.

为了通过运行:

为了正常运行可以设置LD_LIBRARY_PATH.

--disable-new-dtags,---dt-needed-entries

结论概述:

1.我们在生成间接依赖的库的时候,为了保证其他库可以直接依赖,需要加入-Wl,-rpath.保证编译通过.

2.LD_LIBRARY_PATH可以解决一切编译运行问题.

Ⅳ mybatis 想修改动态编译用到的参数该怎么用拦截器

拦截器的一个作用就是我们可以拦截某些方法的调用,我们可搏者以选择在这些被拦截的方法执行前后加上某些逻辑,裂芦也可以在执行这些被拦截的方法时执行自己的逻辑而不再执肆银带行被拦截的方法。

Ⅵ 请教python调用dll动态库的传参问题

按C语袭消言的规则就可以。 不过你的DLL是什么编译的。 如果是宴雀C++的则与C不同。另外编译器也相关。 BC和拍祥知VC还有其它编译器编译出来的DLL也有些微的区别。

Ⅶ 系统编译:如何给Make命令来传递参数

但有时候我们还是需要让make命令带入些参数给makefile脚本 比如你在代码里面需要定义个宏DEBUG来打开调试开关代码如下:{i=9;#def DEBUGi=1;#i=0;#endprf("i=%d\n", i);0;} 般来说这个宏定义可以通过直接修改源代码进行但这样显然不是很好办法 另外个办法是通过makefile修改比如: CFLAGS=-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 如果更进步连makefile都不想修改我们可以通过向make命令传递参数来进行为此我们需要适当修改makefile如下: CFLAGS=CFLAG CFLAGS-g -Wall -DDEBUG object=myprog all:$objectmyprog:a.c gcc ${CFLAGS} a.c -o ${object} 此时如果想打开DEBUG宏我们可以这样输入make命令: [ychq@ICM3-2 net]$ make CFLAG=-DDEBUG gcc -g -Wall -DDEBUG a.c a.c: In function `': a.c:9: warning: implicit declaration of function `prf' [ychq@ICM3-2 net]$ 我们可以发现DEBUG宏已经被正确传入 更进步我们可以通过传递区别参数给make让make编译区别模块

Ⅷ 动态代理 里面传递的参数,对象 为什么一定要是final 的,不是编译不过去是一回事,还有什么其他意义吗

这个和动态代理没睁汪返有关系悉饥,只是因为你使用了内陵举部类。看下这个文章吧,说得很详细。
http://feiyeguohai.iteye.com/blog/1500108

Ⅸ C#字符串转换为可运行的代码 例如:string str="int i=0;"; 然后通过什么方法能动态生成。。(+﹏+)~

用反射吧,C#没有类似exec这样的代码,下面的是一个示例,你看一下吧,有不懂的可以问我

//枝闭氏/ <summary>
/// 反射
/// </summary>
/// <param name="formula">字符串表达式</param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public static double Calculate(string formula, double x, double y)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("猛散System.dll");
parameter.GenerateExecutable = false; //<--不生成exe
parameter.GenerateInMemory = true; //<--直接在内存运行
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
GenerateCodeBlocks(formula));
//动态编译(VisualStudio F5的时候也是做这个)
if (result.Errors.Count >态旁 0)
{
//MessageBox.Show("error");
}
//编译成功
double calculated = Convert.ToDouble(result.CompiledAssembly.GetType("demo.calculation").GetMethod("dowork").Invoke(null, new object[] { x, y }));
//这里通过反射调
return calculated;
}

static string GenerateCodeBlocks(string formula)
{
string code =
"using System;" +
"namespace demo" +
"{" +
"public static class calculation" +
"{" +
"public static double dowork(double x, double y)" +
"{ return " + formula +
";}}}"; //这里是将你的formula和代码片段拼接成完整的程序准备编译的过程。
return code;
}

Ⅹ windows下的gcc编译器如何给主函数传参数

gcc编译器不是传递参数用的,是编译程序代码,输出可执行对象。在windows的shell命令中,第一个参数是可执行文件名,后面的按照顺序对应主函数的参数。

热点内容
sqlserver导出mdf 发布:2025-07-10 19:52:55 浏览:669
安卓应用怎么样安装电脑 发布:2025-07-10 19:51:16 浏览:188
java修改文件时间 发布:2025-07-10 19:50:30 浏览:989
ftp需要重新配置 发布:2025-07-10 19:42:25 浏览:776
加密兔官网地址 发布:2025-07-10 19:32:38 浏览:350
广州win10电脑服务器托管 发布:2025-07-10 19:16:09 浏览:678
疫苗的存储与运输 发布:2025-07-10 19:11:54 浏览:90
安卓原相机怎么p白皮 发布:2025-07-10 19:10:24 浏览:525
编译原理词法的等价描述形式有 发布:2025-07-10 19:10:09 浏览:375
twrp哪个版本支持安卓11 发布:2025-07-10 18:59:22 浏览:849