04
kwi
08

Mechanizm refleksji i własne DLL

Na potrzeby najbliższego projektu w C# musiałem nieco dowiedzieć się na temat refleksji ( Reflection ). Otóż przydaje się on w momencie gdy chcemy uruchamiać jakieś metody na poziomie wykonywanego programu a nie na poziomie kompilacji. Nie wiemy co to za obiekt, nie wiemy jakie ma metody i atrybuty.

Stworzyłem więc własną prościutką bibliotekę DLL, służy do tego wizard z Visual Studio. Kod poniżej:

namespace FirstDLL
{
public class Maths
{
public double Add( double d1, double d2 )
{
return d1+d2;
}

public double Substract( double d1, double d2 )
{
return d1-d2;
}
}
}

// a drugi plik:
namespace FirstDLL
{
class Writer
{
private string message = “heloł world”;

public string Message
{
get
{
return message;
}
set
{
message = value;
}
}

public void WriteMessage()
{
Console.WriteLine( message );
}
}
}

Są dwie klasy, żeby DLL nie składało się tylko z jednej ;) Zbudowanie projektu dało mi w efekcie plik FirstDLL.dll, który to umieściłem w projekcie z testowanym mechanizmem refleksji. Oto kod tej klasy ( bardzo zagmatwany, ale nieco się nakombinowałem ):

namespace ReflectionTest
{
class Program
{
static void Main( string[] args )
{
Assembly asem = Assembly.LoadFrom( “FirstDLL.dll” );
Type[] types = asem.GetTypes();
double result=0.0;

foreach ( Type t in types )
{
object my = Activator.CreateInstance( t );
if ( t.IsClass )
{
MethodInfo[] mem = t.GetMethods();
foreach ( MethodInfo m in mem )
{
if ( m.Name.CompareTo( “Add” ) == 0 )
{
object[] arg = new object[2];
arg[0] = 5.4;
arg[1] = 2;
result = (double)m.Invoke( my, arg );
}
}
}
}
Console.WriteLine( result.ToString() );

}
}
}

Oczywiście nie jest to kod niesamowity ani niosący jakieś szczególne zastosowanie w reflekcji - po prostu chciałem sprawdzić czy działa. Mam nadzieję, że ten prosty przykład pozwoli postawić pierwsze kroki w tej kwestii. Ja również dopiero się tego uczę i może za jakiś czas pojawi się bardziej praktyczny przykład.


0 Odpowiedzi do “Mechanizm refleksji i własne DLL”


  1. Brak komentarzy

Napisz odpowiedź