asp.Netdll動的生成と呼び出し

6943 ワード

  /// <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);