Hi
da ich im Moment an einem interface-service-basierten Plug-In-System arbeite, bei dem auch die Sicherheit eine Rolle spielt, habe ich mir ein Programm geschrieben, das Klassen zur Laufzeit erzeugt, die Interfaces implementieren. Dadurch kann man statt der Instanzen der Services die erzeugte Instanz übergeben. Die Aufrufe an das Interface werden an eine "Delegationseinheit" weitergeleitet, die die Aufrufe dann entsprechend verarbeiten kann. Neben der oben genannten Verwendung kann man sie auch z.B. für Remoting über TCP, Pipes, usw. verwenden, indem man die Daten bspw. per Serialisierung an das Ziel überträgt (Für Sicherheit habe ich aber beim bereitgestellten Code nicht gesorgt).
Name des Programms:
InterfaceDelegation
Screenshot:
Verwendete Programmiersprache und IDE:
C# (IDE: C# 2010 Express)
Systemanforderungen:
.NET Framework 2.0
Download:
Sourcecode + Programmbibliothek (Gepackt: 16 Kb, Entpackt ca. 55 Kb)
Programmbibliothek (Gepackt: 7 Kb, Entpackt: 15 Kb)
Beispiel
Lizenz/Weitergabe:
Freeware; OpenSource
Eine namentliche Erwähnung wäre bei einer Verwendung nett.
Das kann vmtl. nicht unbedingt jeder brauchen, aber den ein oder anderen könnte auch der Quellcode interessieren. Viel Spaß ;).
Gruß
~blaze~
da ich im Moment an einem interface-service-basierten Plug-In-System arbeite, bei dem auch die Sicherheit eine Rolle spielt, habe ich mir ein Programm geschrieben, das Klassen zur Laufzeit erzeugt, die Interfaces implementieren. Dadurch kann man statt der Instanzen der Services die erzeugte Instanz übergeben. Die Aufrufe an das Interface werden an eine "Delegationseinheit" weitergeleitet, die die Aufrufe dann entsprechend verarbeiten kann. Neben der oben genannten Verwendung kann man sie auch z.B. für Remoting über TCP, Pipes, usw. verwenden, indem man die Daten bspw. per Serialisierung an das Ziel überträgt (Für Sicherheit habe ich aber beim bereitgestellten Code nicht gesorgt).
Name des Programms:
InterfaceDelegation
Screenshot:
Verwendete Programmiersprache und IDE:
C# (IDE: C# 2010 Express)
Systemanforderungen:
.NET Framework 2.0
Download:
Sourcecode + Programmbibliothek (Gepackt: 16 Kb, Entpackt ca. 55 Kb)
Programmbibliothek (Gepackt: 7 Kb, Entpackt: 15 Kb)
Beispiel einer sehr einfachen Delegationseinheit, die, außer zum Vorzeigen, sinnlos ist:
Verwendung:
marshalByRef gibt übrigens an, ob die Instanz über Anwendungsdomänen hinweg die gleiche sein soll. Würde man dies nicht tun, müssten die Daten per Serialisierung bereitgestellt werden. Siehe hierzu
C-Quellcode
- using System;
- using System.Collections.Generic;
- namespace DynamicInterface
- {
- public class TestDelegationUnit : Delegation.IDelegationUnit
- {
- private readonly IDictionary<Type, object> _instances;
- public TestDelegationUnit(IDictionary<Type, object> instances)
- {
- _instances = instances; //Stellt die zu type aus Invoke zugehoerigen Instanzen Bereit
- }
- public object Invoke(Type type, System.Reflection.MethodInfo method, Type[] argumentTypes, object state, object[] parameters)
- {
- if (method.IsGenericMethodDefinition) //Setzt ggf. generische Parameter bei Methodenaufrufen
- method = method.MakeGenericMethod(argumentTypes);
- return method.Invoke(_instances[type], parameters); //Ruft die Methode auf den im Dictionary bereitgestellten Instanzen auf
- }
- }
- }
Verwendung:
C-Quellcode
- //Dynamische Assembly automatisch erzeugen lassen
- InterfaceDelegateProvider unit = InterfaceDelegateProvider.DefineNew(new System.Reflection.AssemblyName("Test"), false);
- IDictionary<Type, object> instances = new Dictionary<Type, object>(); //enthaelt die Service-Provider, die angefordert werden koennen
- IServiceProvider delegatedInterface = unit.CreateInstance<IServiceProvider>(new TestDelegationUnit(instances));
- instances.Add(typeof(IServiceProvider), new ExampleService()); //Unseren Test-Service-Provider bereitstellen
- MessageBox.Show(delegatedInterface.GetService(typeof(int)).ToString()); //Service indirekt aufrufen
marshalByRef gibt übrigens an, ob die Instanz über Anwendungsdomänen hinweg die gleiche sein soll. Würde man dies nicht tun, müssten die Daten per Serialisierung bereitgestellt werden. Siehe hierzu
System.AppDomain
und System.MarshalByRefObject
.Lizenz/Weitergabe:
Freeware; OpenSource
Eine namentliche Erwähnung wäre bei einer Verwendung nett.
Das kann vmtl. nicht unbedingt jeder brauchen, aber den ein oder anderen könnte auch der Quellcode interessieren. Viel Spaß ;).
Gruß
~blaze~
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ ()