- Beiträge: 63
Einbindung externer DLL in .Net-Heater
- Heinz-Bernd Monschau
- Autor
- Offline
- Benutzer
Weniger
Mehr
14 Jahre 4 Monate her #93
von Heinz-Bernd Monschau
Einbindung externer DLL in .Net-Heater wurde erstellt von Heinz-Bernd Monschau
Ich habe einen umfangreichen .Net-Heater, den ich in einigen Flowheatern benutzen muss.
Aktuell kommt es zu vielen Überarbeitungen des Codes des Heaters, diese Überarbeitungen muss ich in allen fhd vornehmen, in denen ich den Code verwende.
Ist es möglich den verwendeten Code als DLL zu kompilieren und in die .Net-Heater einzubinden, so das ich statt aller überarbeitungen lediglich den Quellcode einmal ändere und die DLL neu kompiliere?
Aktuell kommt es zu vielen Überarbeitungen des Codes des Heaters, diese Überarbeitungen muss ich in allen fhd vornehmen, in denen ich den Code verwende.
Ist es möglich den verwendeten Code als DLL zu kompilieren und in die .Net-Heater einzubinden, so das ich statt aller überarbeitungen lediglich den Quellcode einmal ändere und die DLL neu kompiliere?
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
14 Jahre 4 Monate her - 5 Jahre 3 Wochen her #94
von FlowHeater-Team
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
FlowHeater-Team antwortete auf Einbindung externer DLL in .Net-Heater
Hallo Herr Monschau,
mit der aktuellen Version geht das leider noch nicht. Unter FlowHeaterBeta.zip liegt aber ein leicht modifizierter FlowHeater damit kann das abgebildet werden
Das ganze beruht auf folgenden kleinen C# .NET Skript Code für den .NET Script Heater .
Zur Verdeutlichung der Arbeitsweise ist im Anhang ein Beispiel inkl. Test DLL vorhanden. In der DLL ist eine Methode Rechne vorhanden, die 2 Übergabeparameter (int) besitzt und davon die Summe zurückliefert.
Das Skript an sich ist zwar in C#, hiermit können aber problemlos auch .NET DLLs die über VB.NET erstellt wurden, dynamisch geladen werden. Zum anpassen an den notwendigen stellen den DLL-, Klassen- bzw. Methodennamen austauschen. Evtl. noch die Übergabeparameter anpassen, das war´s auch schon.
Achtung: Das Beispiel läuft nur mit der hier verfügbaren Testversion (FlowHeaterBeta.zip) oder mit einer Version >= 1.1.9, die demnächst erscheinen wird!
mit der aktuellen Version geht das leider noch nicht. Unter FlowHeaterBeta.zip liegt aber ein leicht modifizierter FlowHeater damit kann das abgebildet werden
Das ganze beruht auf folgenden kleinen C# .NET Skript Code für den .NET Script Heater .
Code:
object instance = null;
public object DoWork()
{
BindingFlags baseBindingFlags = BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
// beim 1. Aufruf DLL laden und Instance erzeugen
if (instance == null)
{
// Klassenname inkl. kompletten Namespace
string classname = "FHTest.Class1";
// welche .NET DLL soll geladen werden
// die DLL wird aus dem gleichen Verzeichnis, wo die Definition gespeichert ist, geladen
// es gehen aber auch absolute Pfadangaben!
Assembly asm = Assembly.LoadFrom("FHTest.dll");
// Instance der Klasse erzeugen
Type t = asm.GetType(classname);
instance = t.InvokeMember(classname, baseBindingFlags | BindingFlags.CreateInstance, null, null, null);
}
// Heater Eingangsparameter holen
int i1 = (int)InValues[0].GetInt();
int i2 = (int)InValues[1].GetInt();
// Übergabeparamater für die Funktion festlegen.
// Die Anzahl sowie Typen der Parameter richtet sich nach der Methode die gerufen werden soll
object[] args = { i1, i2 };
// Methode Rechne der Klasse Class1 aufrufen und Wert zurückliefern
return instance.GetType().InvokeMember("Rechne", baseBindingFlags | BindingFlags.InvokeMethod, null, instance, args);
}
Zur Verdeutlichung der Arbeitsweise ist im Anhang ein Beispiel inkl. Test DLL vorhanden. In der DLL ist eine Methode Rechne vorhanden, die 2 Übergabeparameter (int) besitzt und davon die Summe zurückliefert.
Das Skript an sich ist zwar in C#, hiermit können aber problemlos auch .NET DLLs die über VB.NET erstellt wurden, dynamisch geladen werden. Zum anpassen an den notwendigen stellen den DLL-, Klassen- bzw. Methodennamen austauschen. Evtl. noch die Übergabeparameter anpassen, das war´s auch schon.
Achtung: Das Beispiel läuft nur mit der hier verfügbaren Testversion (FlowHeaterBeta.zip) oder mit einer Version >= 1.1.9, die demnächst erscheinen wird!
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
Anhänge:
Letzte Änderung: 5 Jahre 3 Wochen her von FlowHeater-Team.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Heinz-Bernd Monschau
- Autor
- Offline
- Benutzer
Weniger
Mehr
- Beiträge: 63
14 Jahre 4 Monate her #95
von Heinz-Bernd Monschau
Heinz-Bernd Monschau antwortete auf Einbindung externer DLL in .Net-Heater
Hallo Herr Stark,
fast optimal (bevorzuge vb statt c#).
Läuft super. Der Einsatz dieser Technik verschiebt die Grenze der Möglichkeiten Richtung unendlich.
Besten Gruß
Monschau
fast optimal (bevorzuge vb statt c#).
Läuft super. Der Einsatz dieser Technik verschiebt die Grenze der Möglichkeiten Richtung unendlich.
Besten Gruß
Monschau
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
14 Jahre 3 Monate her #102
von FlowHeater-Team
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
FlowHeater-Team antwortete auf Einbindung externer DLL in .Net-Heater
Hinweis: In der jetzt aktuellen Version 1.1.9 ist dieser Mechanismus bereits vorhanden. Die hier beschriebene BETA Version ist dazu nicht mehr notwendig.
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Heinz-Bernd Monschau
- Autor
- Offline
- Benutzer
Weniger
Mehr
- Beiträge: 63
14 Jahre 2 Monate her #142
von Heinz-Bernd Monschau
Heinz-Bernd Monschau antwortete auf Einbindung externer DLL in .Net-Heater
Hallo Forumsleser,
ist jemand in der Lage den Beispielcode zur Einbindung einer externen dll con C# nach vb.net zu übersetzen?
Ich bin daran gescheitert.
ist jemand in der Lage den Beispielcode zur Einbindung einer externen dll con C# nach vb.net zu übersetzen?
Ich bin daran gescheitert.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- FlowHeater-Team
- Offline
- Administrator
14 Jahre 2 Monate her #150
von FlowHeater-Team
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
FlowHeater-Team antwortete auf Einbindung externer DLL in .Net-Heater
VB.NET ist gerade bei solch komplexen Sachen nicht so mein Ding, hab es trotzdem mal versucht. Hier der Skript Code in VB.NET.
Leider funktioniert das ganze bei mir nicht über den .NET Script Heater vom FlowHeater. Aus einer VB.NET Visual Studio WinForms Solution Anwendung heraus klappt es aber mit der DLL aus dem Beispiel.
Bitte versuchen Sie das mal bei sich mit einer reinen VB.NET DLL, ich könnte mir Vorstellen dass es dann funktioniert, ein Versuch ist es Wert.
Anmerkung: Der C# Skript Code funktioniert
Code:
Dim instance As Object
Private Function DoWork() As Object
Dim baseBindingFlags As BindingFlags
baseBindingFlags = BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance
' beim 1. Aufruf DLL laden und Instance erzeugen
If instance = Nothing Then
' Klassenname inkl. kompletten Namespace
Dim classname As String
classname = "FHTest.Class1"
' welche .NET DLL soll geladen werden
' die DLL wird aus dem gleichen Verzeichnis, wo die Definition gespeichert ist, geladen
' es gehen aber auch absolute Pfadangaben!
Dim asm As Assembly
asm = Assembly.LoadFrom("FHTest.dll")
' Instance der Klasse erzeugen
Dim t As Type
t = asm.GetType(classname)
instance = t.InvokeMember(classname, BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
End If
' Heater Eingangsparameter holen
Dim i1 As Integer
Dim i2 As Integer
i1 = InValues(0).GetInt()
i2 = InValues(1).GetInt()
' Übergabeparamater für die Funktion festlegen.
' Die Anzahl sowie Typen der Parameter richtet sich nach der Methode die gerufen werden soll
Dim args() As Object = {i1, i2}
' Methode Rechne der Klasse Class1 aufrufen und Wert zurückliefern
DoWork = instance.GetType().InvokeMember("Rechne", BindingFlags.InvokeMethod, Nothing, instance, args)
End Function
Leider funktioniert das ganze bei mir nicht über den .NET Script Heater vom FlowHeater. Aus einer VB.NET Visual Studio WinForms Solution Anwendung heraus klappt es aber mit der DLL aus dem Beispiel.
Bitte versuchen Sie das mal bei sich mit einer reinen VB.NET DLL, ich könnte mir Vorstellen dass es dann funktioniert, ein Versuch ist es Wert.
Anmerkung: Der C# Skript Code funktioniert
gruß
Robert Stark
Wurde Ihre Frage damit beantwortet? Bitte geben Sie ein kurzes Feedback, Sie helfen damit auch anderen die evtl. ein ähnliches Problem haben. Danke.
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Heinz-Bernd Monschau
- Autor
- Offline
- Benutzer
Weniger
Mehr
- Beiträge: 63
14 Jahre 2 Monate her #153
von Heinz-Bernd Monschau
Heinz-Bernd Monschau antwortete auf Einbindung externer DLL in .Net-Heater
Hallo Herr Stark,
fuktioniert.
Es muß lediglich If isNothing(instance) Then
statt If instance=nothing heißen.
Hier nochmal komplett:
Dim instance As Object
Private Function DoWork() As Object
Dim baseBindingFlags As BindingFlags
baseBindingFlags = BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance
' beim 1. Aufruf DLL laden und Instance erzeugen
If isNothing(instance) Then
' Klassenname inkl. kompletten Namespace
Dim classname As String
classname = "FHTest.Class1"
' welche .NET DLL soll geladen werden
' die DLL wird aus dem gleichen Verzeichnis, wo die Definition gespeichert ist, geladen
' es gehen aber auch absolute Pfadangaben!
Dim asm As Assembly
asm = Assembly.LoadFrom("FHTest.dll")
' Instance der Klasse erzeugen
Dim t As Type
t = asm.GetType(classname)
instance = t.InvokeMember(classname, BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
End If
' Heater Eingangsparameter holen
Dim i1 As Integer
Dim i2 As Integer
i1 = InValues(0).GetInt()
i2 = InValues(1).GetInt()
' Übergabeparamater für die Funktion festlegen.
' Die Anzahl sowie Typen der Parameter richtet sich nach der Methode die gerufen werden soll
Dim args() As Object = {i1, i2}
' Methode Rechne der Klasse Class1 aufrufen und Wert zurückliefern
DoWork = instance.GetType().InvokeMember("Rechne", BindingFlags.InvokeMethod, Nothing, instance, args)
End Function
Vielen Dank!
Monschau
fuktioniert.
Es muß lediglich If isNothing(instance) Then
statt If instance=nothing heißen.
Hier nochmal komplett:
Dim instance As Object
Private Function DoWork() As Object
Dim baseBindingFlags As BindingFlags
baseBindingFlags = BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance
' beim 1. Aufruf DLL laden und Instance erzeugen
If isNothing(instance) Then
' Klassenname inkl. kompletten Namespace
Dim classname As String
classname = "FHTest.Class1"
' welche .NET DLL soll geladen werden
' die DLL wird aus dem gleichen Verzeichnis, wo die Definition gespeichert ist, geladen
' es gehen aber auch absolute Pfadangaben!
Dim asm As Assembly
asm = Assembly.LoadFrom("FHTest.dll")
' Instance der Klasse erzeugen
Dim t As Type
t = asm.GetType(classname)
instance = t.InvokeMember(classname, BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
End If
' Heater Eingangsparameter holen
Dim i1 As Integer
Dim i2 As Integer
i1 = InValues(0).GetInt()
i2 = InValues(1).GetInt()
' Übergabeparamater für die Funktion festlegen.
' Die Anzahl sowie Typen der Parameter richtet sich nach der Methode die gerufen werden soll
Dim args() As Object = {i1, i2}
' Methode Rechne der Klasse Class1 aufrufen und Wert zurückliefern
DoWork = instance.GetType().InvokeMember("Rechne", BindingFlags.InvokeMethod, Nothing, instance, args)
End Function
Vielen Dank!
Monschau
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
Ladezeit der Seite: 0.300 Sekunden