當前位置:首頁 » 編程軟體 » 動態編譯傳參

動態編譯傳參

發布時間: 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命令中,第一個參數是可執行文件名,後面的按照順序對應主函數的參數。

熱點內容
dropbear編譯 發布:2025-07-10 08:27:35 瀏覽:684
我的世界電腦建造伺服器推薦 發布:2025-07-10 08:13:08 瀏覽:401
如何提高存儲數據的速度 發布:2025-07-10 07:55:57 瀏覽:259
規范c語言代碼 發布:2025-07-10 07:55:57 瀏覽:516
在線砍價源碼 發布:2025-07-10 07:55:56 瀏覽:796
編程工作年限 發布:2025-07-10 07:44:42 瀏覽:143
vc壓縮文件夾 發布:2025-07-10 07:43:56 瀏覽:450
汽貿解壓 發布:2025-07-10 07:43:56 瀏覽:877
dreamweaver連接資料庫 發布:2025-07-10 07:43:55 瀏覽:742
三菱編程書籍 發布:2025-07-10 07:39:38 瀏覽:496