动态生成一个继承接口的类
接口:
namespace LibertyPortal.Main.IDAL
{
??? public interface Interface1
??? {
??????? void www();
??? }
}???
調用
??????? Assembly assembly = NewAssembly();
??????? Interface1 www = assembly.CreateInstance("xml.tables.Test1") as Interface1;
方法
public static Assembly NewAssembly()
??? {
??????? //foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
??????? //{
??????? //??? string wzcxzww = asm.Location;
??????? //}
??????? //創建編譯器實例。
??????? CSharpCodeProvider provider = new CSharpCodeProvider();
??????? //設置編譯參數。
??????? CompilerParameters paras = new CompilerParameters();
??????? paras.GenerateExecutable = false;
??????? paras.GenerateInMemory = true;
??????? string wwasw= System.Web.HttpContext.Current.Server.MapPath("Bin");
??????? paras.ReferencedAssemblies.Add(wwasw+"http://www.cnblogs.com/cuihongyu3503319/admin/file://libertyportal.main.idal.dll%22);//要真實地址
??????? paras.ReferencedAssemblies.Add("System.dll");//全局的不用
??????? CodeCompileUnit m_CodeCompileUnit;
??????? CodeNamespace m_CodeNameSpace;//命名空間
??????? CodeTypeDeclaration m_Class;//類
??????? m_CodeCompileUnit = new CodeCompileUnit();
??????? m_CodeNameSpace = new CodeNamespace("xml.tables");
??????? m_CodeCompileUnit.Namespaces.Add(m_CodeNameSpace);
??????? m_Class = new CodeTypeDeclaration("Test1");//類名為Test1
??????? m_Class.IsClass = true;//是類
??????? //產生www方法
??????? CodeTypeReference voidReference = new CodeTypeReference("System.void");//方法無返回值
??????? CodeMemberMethod Test = new CodeMemberMethod();//方法
??????? Test.ReturnType = voidReference;
??????? Test.Name = "www";
??????? Test.Attributes = MemberAttributes.Public | MemberAttributes.Final;
??????? //CodeVariableReferenceExpression m_AddFlagExpression = new CodeVariableReferenceExpression("m_AddFlag");
??????? //CodeAssignStatement assignAddTrue = new CodeAssignStatement(m_AddFlagExpression, new CodePrimitiveExpression(true));
??????? //Test.Statements.Add(assignAddTrue);
??????? m_Class.Members.Add(Test);
?
??????? //m_Class.BaseTypes.Add(new CodeTypeReference(typeof(Object)));
??????? m_Class.BaseTypes.Add(new CodeTypeReference(typeof(Interface1)));//類父親
??????? m_CodeNameSpace.Types.Add(m_Class);
??????? #region 輸出生成源代碼
??????? ICodeGenerator g = provider.CreateGenerator();
??????? g.GenerateCodeFromType(m_Class,System.Web.HttpContext.Current.Response.Output , null);??
??????? #endregion
??????? CompilerResults result = provider.CompileAssemblyFromDom(paras, m_CodeCompileUnit);//編譯
??????? if (result.Errors.Count > 0)
??????? {
??????????? // 顯示編譯錯誤信息。??
??????????? string www = "";
??????????? foreach (CompilerError ce in result.Errors)
??????????? {
??????????????? www += ce.ToString();
??????????????? //Debug.WriteLine();
??????????? }
??????????? System.Web.HttpContext.Current.Response.Write(www);
??????????? return null;
??????? }
??????? else
??????? {
??????????? Debug.WriteLine(result.PathToAssembly);
??????? }
??????? //編譯代碼。
??????? //CompilerResults result = provider.CompileAssemblyFromSource(paras, classSource.ToString());
??????? //獲取編譯后的程序集。
??????? Assembly assembly = result.CompiledAssembly;
??????? return assembly;
??? }
總結
以上是生活随笔為你收集整理的动态生成一个继承接口的类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过Visual Studio 2005
- 下一篇: 性能数据转化成函数