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