zoukankan      html  css  js  c++  java
  • asp.net dll 动态生成和调用(转)

      /// <summary>
            /// 动态编译
            /// </summary>
            /// <param name="source"> 要动态编译的代码字符串</param>
            /// <param name="path">生成dll文件的路径</param>
            private void csc(string source, string path)
            {
                CodeDomProvider ccp = CodeDomProvider.CreateProvider("CSharp");
                CompilerParameters options = new CompilerParameters();
                options.GenerateInMemory = true;
                options.GenerateInMemory = false;
                options.TreatWarningsAsErrors = false;
                options.OutputAssembly = path;
                CompilerResults result = ccp.CompileAssemblyFromSource(options, source);
            }


    调用dll

    为了方便说明一下的方法,先说明一下DLL的代码,大致如下:

    using System; 
     
    namespace clsTestDll 
     
    { 
     
        /// <summary> 
     
        /// Summary description for TestDll. 
     
        /// </summary> 
     
        public class TestDll 
     
        { 
     
            private string strName; 
     
            public TestDll() 
     
            { 
     
                // 
     
                // TODO: Add constructor logic here 
     
                // 
     
                strName = ""; 
     
            } 
     
     
     
            public string GetValue( int nCount ) 
     
            { 
     
                return string.Format( "Count is ...{0}!", nCount ); 
     
            } 
     
     
     
            public static string GetNewValue( int nCount ) 
     
            { 
     
                return string.Format( "New count is ...{0}!", nCount ); 
     
            } 
     
     
     
            public string Name 
     
            { 
     
                get{ return strName;} 
     
                set{ strName = value;} 
     
            } 
     
        } 
     
    }

    大致的步骤如下:
     首先加载DLL,具体如下:

        // Load assembly from dll file 
     
        Assembly assembly = Assembly.LoadFrom( "clsTestDll.dll"); 

    其次,用加载的assembly来定义指定的类型,例如:

        // Create new type 
     
        Type t = assembly.GetType( "clsTestDll.TestDll");


            然后就可以通过新建的类型来调用类的方法。
           如果是类的静态方法,可以直接调用,如:

    // Call static member function by name 
     
        string strReturn = (string) t.InvokeMember("GetNewValue", 
     
            BindingFlags.DeclaredOnly | 
     
            BindingFlags.Public | 
     
            BindingFlags.Static | BindingFlags.InvokeMethod, 
     
            null, 
     
            null, 
     
            new object[]{ 12 } );

    如果是类的非静态方法或属性,则需要通过类型,先生成类的对象,如:

     // Create new object of specific class name 
     
        Object obj = t.InvokeMember( 
     
            null, 
     
            BindingFlags.DeclaredOnly | 
     
            BindingFlags.Public | BindingFlags.NonPublic | 
     
            BindingFlags.Instance | BindingFlags.CreateInstance, 
     
            null, 
     
            null, 
     
            null );

    接着,就可以通过“obj”对象来进行调用了,如:

    // Call member function by name 
     
        strReturn = (string) t.InvokeMember("GetValue", 
     
            BindingFlags.DeclaredOnly | 
     
            BindingFlags.Public | BindingFlags.NonPublic | 
     
            BindingFlags.Instance | BindingFlags.InvokeMethod, 
     
            null, 
     
            obj, 
     
            new object[]{ 12 } ); 
     
     
     
        // Set class property 
     
        t.InvokeMember("Name", 
     
            BindingFlags.DeclaredOnly | 
     
            BindingFlags.Public | BindingFlags.NonPublic | 
     
            BindingFlags.Instance | BindingFlags.SetProperty, 
     
            null, 
     
            obj, 
     
            new Object[] {"Test"} ); 
     
     
     
        // Get class property 
     
        strReturn = (string) t.InvokeMember("Name", 
     
            BindingFlags.DeclaredOnly | 
     
            BindingFlags.Public | BindingFlags.NonPublic | 
     
            BindingFlags.Instance | BindingFlags.GetProperty, 
     
            null, 
     
            obj, 
     
            null);
  • 相关阅读:
    WCF基础 (续 更多关于配置文件的内容)
    WCF基础 (续 暴露元数据交换节点)
    简单的asp.net文件上传类
    根据年份月份,获得此月份的所有日期[转]
    JS 设为首页/加入收藏
    WCF基础 (续 使用代码生成WCF服务)
    WPF自定义标题栏——窗口移动和按钮状态转换[转]
    WCF元数据交换
    WCF基础 (续 为一个ASMX服务实现一个WCF客户端) 完结
    WCF基础 (续 通过代码和配置文件写一个WCF服务)
  • 原文地址:https://www.cnblogs.com/Guroer/p/2995843.html
Copyright © 2011-2022 走看看