国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 運用(codeDom和反射技術(shù))動態(tài)編譯dll ,動態(tài)調(diào)用

這篇具有很好參考價值的文章主要介紹了C# 運用(codeDom和反射技術(shù))動態(tài)編譯dll ,動態(tài)調(diào)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? 在軟件運用工程中,往往會根據(jù)各種各樣,花樣百出的需求來設(shè)計軟件,在最近的項目中無意中,我就遇到了一個需求,據(jù)說是,客戶要動態(tài)編譯dll ,我“滴個乖乖”,這是要逆天??!

話不多說,直接來點干貨。

簡單分享一下個小demo:

1.運用codeDom技術(shù)實現(xiàn)動態(tài)程序集編譯。


? ? ? ? ? ? ? ? string strExpre = "using System;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "using System.Collections.Generic;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "using System.Linq;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"using System.Web; " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"namespace 特殊字符.Dll.Ver" + newVer + " " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "{" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "public class Test" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "{" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "" + newStr + "" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "}" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? " }";
? ? ? ? ? ? ? ? CSharpCodeProvider cs = new CSharpCodeProvider();//創(chuàng)建代碼生成器

? ? ? ? ? ? ? ? ICodeCompiler cc = cs.CreateCompiler();//實現(xiàn)并創(chuàng)建代碼編譯器實例

? ? ? ? ? ? ? ? CompilerParameters cp = new CompilerParameters();//編譯器的實例參數(shù)

? ? ? ? ? ? ? ? cp.GenerateExecutable = false;//是否生成.exe

? ? ? ? ? ? ? ? cp.ReferencedAssemblies.Add("System.dll");//加載所需的dll

? ? ? ? ? ? ? ? cp.ReferencedAssemblies.Add("System.Core.dll");


? ? ? ? ? ? ? ? cp.OutputAssembly = path;


? ? ? ? ? ? ? ? CompilerResults cr = cc.CompileAssemblyFromSource(cp, strExpre);

? ? ? ? ? ? ? ?


? ? ? ? ? ? ? ? if (cr.Errors.HasErrors)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? // ?Console.WriteLine(cr.Errors.ToString());
? ? ? ? ? ? ? ? ? ? Directory.Delete(HttpContext.Current.Server.MapPath(dir));
? ? ? ? ? ? ? ? ? ? throw new Exception();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

}

2.運用反射技術(shù),根據(jù)程序集實例化類,并調(diào)用方法


? ? ? ? ? ? ? ? ? ? //Assembly ass = cr.CompiledAssembly;//動態(tài)編譯程序集(只限于動態(tài),當(dāng)程序連續(xù)動態(tài)編譯時只能加載出程序上次啟動得dll文件)
? ? ? ? ? ? ? ? ? ? //新編譯出的文件路徑
? ? ? ? ? ? ? ? ? ? string newComplierPath = HttpContext.Current.Server.MapPath(@"Dll\Ver" + newVer.ToString() + @"\Test.dll");

? ? ? ? ? ? ? ? ? ? Assembly ass = Assembly.LoadFile(newComplierPath);

? ? ? ? ? ? ? ? ? ? object obj = ass.CreateInstance("特殊字符.Dll.Ver" + newVer + ".Test");

? ? ? ? ? ? ? ? ? ? MethodInfo mi = obj.GetType().GetMethod("save");

? ? ? ? ? ? ? ? ? ? resulta = (int)mi.Invoke(obj, new object[] { num });

3.前端參數(shù):

string newStr=public int save(int a){int b=a; return b;};

4.直接上完整代碼:

using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;
using Newtonsoft.Json;
using ReportSystem.DAL;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using 特殊字符.Model;

namespace 特殊字符
{
? ? /// <summary>
? ? /// handle 的摘要說明
? ? /// </summary>
? ? public class handle : IHttpHandler
? ? {

? ? ? ? public void ProcessRequest(HttpContext context)
? ? ? ? {

? ? ? ? ? ? int resulta = 0;
? ? ? ? ? ? var result = context.Request["content"];
? ? ? ? ? ? var num = Convert.ToInt32(context.Request["num"]);
? ? ? ? ? ?
? ? ? ? ? ? var newStr = HttpUtility.UrlDecode(result);
? ? ? ? ? ??
? ? ? ? ? ? FileVerValidate vervalidateOld =getLastVerInfo();//舊版
? ? ? ? ? ? string signStrNew = SHAEncryption(newStr);//當(dāng)前
? ? ? ? ? ? if (signStrNew == vervalidateOld.signStr)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? context.Response.Write("版本未變");
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string lastVerNo = vervalidateOld.vernum;
? ? ? ? ? ? ? ? double newVer = Convert.ToDouble(lastVerNo) + 1;

? ? ? ? ? ? ? ? string dir = @"Dll\Ver" + newVer.ToString();

? ? ? ? ? ? ? ? if (!Directory.Exists(dir))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Directory.CreateDirectory(HttpContext.Current.Server.MapPath(dir));
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? string path = HttpContext.Current.Server.MapPath(dir + @"\AccountTest.dll");

? ? ? ? ? ? ? ? string strExpre = "using System;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "using System.Collections.Generic;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "using System.Linq;" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"using System.Web; " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"namespace 特殊字符.Dll.Ver" + newVer + " " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "{" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "public class AccountTest" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "{" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "" + newStr + "" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "}" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? " }";

? ? ? ? ? ? ? ? CSharpCodeProvider cs = new CSharpCodeProvider();

? ? ? ? ? ? ? ? ICodeCompiler cc = cs.CreateCompiler();

? ? ? ? ? ? ? ? CompilerParameters cp = new CompilerParameters();

? ? ? ? ? ? ? ? cp.GenerateExecutable = false;

? ? ? ? ? ? ? ? cp.ReferencedAssemblies.Add("System.dll");

? ? ? ? ? ? ? ? cp.ReferencedAssemblies.Add("System.Core.dll");


? ? ? ? ? ? ? ? cp.OutputAssembly = path;


? ? ? ? ? ? ? ? CompilerResults cr = cc.CompileAssemblyFromSource(cp, strExpre);

? ? ? ? ? ? ? ?


? ? ? ? ? ? ? ? if (cr.Errors.HasErrors)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? // ?Console.WriteLine(cr.Errors.ToString());
? ? ? ? ? ? ? ? ? ? Directory.Delete(HttpContext.Current.Server.MapPath(dir));
? ? ? ? ? ? ? ? ? ? throw new Exception();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? //Assembly ass = cr.CompiledAssembly;//動態(tài)編譯程序集(只限于動態(tài),當(dāng)程序連續(xù)動態(tài)編譯時只能加載出程序上次啟動得dll文件)
? ? ? ? ? ? ? ? ? ? //新編譯出的文件路徑
? ? ? ? ? ? ? ? ? ? string newComplierPath = HttpContext.Current.Server.MapPath(@"Dll\Ver" + newVer.ToString() + @"\AccountTest.dll");

? ? ? ? ? ? ? ? ? ? Assembly ass = Assembly.LoadFile(newComplierPath);

? ? ? ? ? ? ? ? ? ? object obj = ass.CreateInstance("特殊字符.Dll.Ver" + newVer + ".AccountTest");

? ? ? ? ? ? ? ? ? ? MethodInfo mi = obj.GetType().GetMethod("save");

? ? ? ? ? ? ? ? ? ? resulta = (int)mi.Invoke(obj, new object[] { num });

? ? ? ? ? ? ? ? ? ? string sql = "insert into DynamicDllVerRecord values('" + newStr + "','" + newVer.ToString() + "','" + GetTimeStamp() + "',0,'Mr.Wang','"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"');" +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"update DynamicDllVerRecord set TimeStamp='' where Id=" + vervalidateOld.Id + "";
? ? ? ? ? ? ? ? ? ? int resultNum = SQLHelper.ExecuteNonQuerySQL(sql);

? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? context.Response.Write(resulta);
? ? ? ? }
? ? ? ? #region 獲得上次版本信息

? ? ??
? ? ? ? private ?FileVerValidate getLastVerInfo() {
? ? ? ? ? ? FileVerValidate validate = new FileVerValidate();
? ? ? ? ? ? string sql = "select top(1)Id,Ver,FunStr from DynamicDllVerRecord where TimeStamp<>'' order by CreateDate desc;;";
? ? ? ? ? ? DataTable obj=SQLHelper.ExecuteDataTableSQL(sql);

? ? ? ? ? ? string sql2 = "select top(1)Id,Ver,FunStr from DynamicDllVerRecord order by CreateDate desc;";
? ? ? ? ? ? DataTable obj2 = SQLHelper.ExecuteDataTableSQL(sql2);
? ? ? ? ? ? string verNo = "";
? ? ? ? ? ? string funStr = string.Empty;
? ? ? ? ? ? int id = 0;
? ? ? ? ? ? if (obj2.Rows.Count == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? verNo = "";
? ? ? ? ? ? ? ? funStr = "";
? ? ? ? ? ? ? ? id = 0;
? ? ? ? ? ? }
? ? ? ? ? ? else if (obj.Rows.Count == 0 && obj2.Rows.Count != 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? verNo = obj2.Rows[0]["Ver"].ToString();
? ? ? ? ? ? ? ? funStr = obj2.Rows[0]["FunStr"].ToString();
? ? ? ? ? ? ? ? id= Convert.ToInt32(obj2.Rows[0]["Id"].ToString());
? ? ? ? ? ? }
? ? ? ? ? ? else if (obj.Rows.Count != 0 && obj2.Rows.Count != 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? verNo = obj.Rows[0]["Ver"].ToString();
? ? ? ? ? ? ? ? funStr = obj.Rows[0]["FunStr"].ToString();
? ? ? ? ? ? ? ? id = Convert.ToInt32(obj.Rows[0]["Id"].ToString());
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? ? ? if (funStr != "")
? ? ? ? ? ? {

? ? ? ? ? ? ?

? ? ? ? ? ? ? ? string resturnStr = SHAEncryption(funStr);//字符傳內(nèi)容簽名

? ? ? ? ? ? ? ? validate.signStr = resturnStr;

? ? ? ? ? ? ? ? validate.vernum = verNo;

? ? ? ? ? ? ? ? validate.Id = id;

? ? ? ? ? ? }

? ? ? ? ? ? return validate;
? ? ? ? ??


? ? ? ? }

? ? ? ? #endregion


? ? ? ? #region 數(shù)字簽名dll內(nèi)容

? ? ? ? public static string SHAEncryption(string FunStr)
? ? ? ? {

? ? ? ? ? ? byte[] bytes = Encoding.Default.GetBytes(FunStr);
? ? ? ? ? ? SHA1 sha = new SHA1Managed();
? ? ? ? ? ? byte[] result_byte = sha.ComputeHash(bytes);
? ? ? ? ? ? return Convert.ToBase64String(result_byte);
? ? ? ? }

? ? ? ? #endregion
? ? ? ? public bool IsReusable
? ? ? ? {
? ? ? ? ? ? get
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? /// <summary>?
? ? ? ? /// 獲取時間戳?
? ? ? ? /// </summary>?
? ? ? ? /// <returns></returns>?
? ? ? ? public static string GetTimeStamp()
? ? ? ? {
? ? ? ? ? ? TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
? ? ? ? ? ? return Convert.ToInt64(ts.TotalSeconds).ToString();
? ? ? ? }
? ? }

? ? public class ?FileVerValidate {

? ? ? ? public int Id { set; get; }

? ? ? ? public ?string vernum { set; get; }

? ? ? ? public ?string signStr { set; get; }
? ? }
}

以上代碼是基于后臺的角度對版本,和內(nèi)容匹配,添加相關(guān)邏輯。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?----------------“天行健,君子以自強不息;地勢坤,君子以厚德載物”文章來源地址http://www.zghlxwxcb.cn/news/detail-545251.html

到了這里,關(guān)于C# 運用(codeDom和反射技術(shù))動態(tài)編譯dll ,動態(tài)調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • stable-diffusion.cpp 一個文件解決stable diffusion所有環(huán)境,不需要python,stable-diffusion.dll動態(tài)庫C#調(diào)用Demo

    stable-diffusion.cpp 一個文件解決stable diffusion所有環(huán)境,不需要python,stable-diffusion.dll動態(tài)庫C#調(diào)用Demo

    stable-diffusion.cpp 一個文件解決stable-diffusion所有環(huán)境,不需要python,stable-diffusion.dll動態(tài)庫C#調(diào)用Demo 目錄 介紹 效果 Text To Image Image To Image Upscale 項目 代碼 Native.cs SDHelper.cs MainForm.cs 下載? stable-diffusion.cpp 地址:https://github.com/leejet/stable-diffusion.cpp StableDiffusionSharp 地址:https://

    2024年04月14日
    瀏覽(21)
  • 【C#】反射機制,動態(tài)加載類文件

    【C#】反射機制,動態(tài)加載類文件

    【C#】編號生成器(定義單號規(guī)則、固定字符、流水號、業(yè)務(wù)單號) 本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范圍生成器(開始日期、結(jié)束日期) 本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129040663 【C#】組件化開發(fā),調(diào)用dll組件方法 本文鏈接

    2024年02月11日
    瀏覽(16)
  • Qt動態(tài)調(diào)用(外部調(diào)用)SDK庫(dll動態(tài)庫)

    Qt動態(tài)調(diào)用(外部調(diào)用)SDK庫(dll動態(tài)庫)

    ??????? ?之前的文章,介紹了Qt調(diào)用sdk庫的方式,大家可以點擊查看(Q調(diào)用SDK庫(dll動態(tài)庫))之前的文章,里面介紹的調(diào)用方式就是靜態(tài)的調(diào)用方式。如下圖所示,需要提供.h文件,dll文件和lib文件。 ?本篇文章主要實現(xiàn)通過一個dll文件,外部動態(tài)調(diào)用的方式來調(diào)用我

    2024年02月09日
    瀏覽(20)
  • C#調(diào)用C++ dll教程

    C#調(diào)用C++ dll教程

    在使用C#開發(fā)客戶端時,有時需要調(diào)用C++ dll,本篇博客來介紹C#程序如何調(diào)用C++ dll。 首先使用VS2022創(chuàng)建C++ dll項目,具體步驟如下: (1)選擇Windows桌面向?qū)?,點擊下一步, 取項目名,例如我的dll項目名是libMath (2)選擇動態(tài)項目,勾選導(dǎo)出符號 (3)編寫動態(tài)代碼,代碼如下

    2024年01月25日
    瀏覽(20)
  • C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    C#開發(fā)DLL,CAPL調(diào)用(CAPL>> .NET DLL)

    ret為dll里函數(shù)返回的值。 在visual studio中建立。

    2024年02月08日
    瀏覽(22)
  • C++調(diào)用C# dll成功示例

    C++調(diào)用C# dll成功示例

    一.準(zhǔn)備C# dll類庫 。生成CSLib.dll ?二、寫C++應(yīng)用調(diào)用 ?1)需要把dll復(fù)制到運行目錄下。(不然會提示找不到dll System.IO.FileNotFoundException:“未能加載文件或程序集“CSLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一個依賴項。系統(tǒng)找不到指定的文件) 2)設(shè)置\\\"公共語言運

    2024年02月14日
    瀏覽(22)
  • C# DLL嵌套調(diào)用時修改生效

    C# DLL嵌套調(diào)用時,需要以被修改的DLL作為最下層,從下往上地重新生成所有DLL才可生效。 DLL1(最下層)代碼: DLL2(中間層)代碼: 應(yīng)用程序代碼: 實驗步驟: 1.在代碼無修改的情況下運行應(yīng)用程序,輸出結(jié)果為A。 2.修改DLL1動態(tài)鏈接庫ConsoleWriteLineSomething方法,使其輸出

    2024年01月25日
    瀏覽(23)
  • C#調(diào)用C++ dll異常排查

    C#調(diào)用C++ dll異常排查

    最近在做的一款程序,長時間運行總會出現(xiàn)莫名的問題。有時是自動關(guān)閉,有時程序報錯,有時調(diào)用的dll異?!?由于開始與C++組合作時,使用其提供的dll出現(xiàn)過數(shù)據(jù)讀寫時異常(內(nèi)存操作異常),于是懷疑他們提供的dll有內(nèi)存泄漏。于是想通過日志或其它方法來確認(rèn)這個猜

    2024年01月21日
    瀏覽(26)
  • c++動態(tài)調(diào)用dll

    在C++中動態(tài)調(diào)用DLL(動態(tài)鏈接庫)可以使用Windows API函數(shù)。以下是一個簡單的示例,演示如何動態(tài)加載和調(diào)用DLL中的函數(shù): 在上面的示例中,我們首先使用LoadLibrary函數(shù)加載DLL。然后,使用GetProcAddress函數(shù)獲取要調(diào)用的函數(shù)的指針。在本例中,我們假設(shè)要調(diào)用的函數(shù)名為\\\"MyFu

    2024年01月24日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包