Zum Hauptinhalt springen
Weil einfach - produktiver ist

Der Daten Spezialist

Konvertieren Sie die Daten mühelos zwischen verschiedenen Formaten ohne Programmierkenntnisse dank Visual Designer. Effizient und super einfach.
Flowheater Chart

Einbindung externer DLL in .Net-Heater

  • Heinz-Bernd Monschau
  • Autor
  • Offline
  • Benutzer
  • Benutzer
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?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
14 Jahre 4 Monate her - 5 Jahre 3 Wochen her #94 von FlowHeater-Team
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 .
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!

Dateianhang:

Dateiname: fh_dll_test.zip
Dateigröße:3 KB

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.
Letzte Änderung: 5 Jahre 3 Wochen her von FlowHeater-Team.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

  • Heinz-Bernd Monschau
  • Autor
  • Offline
  • Benutzer
  • Benutzer
Mehr
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

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
14 Jahre 3 Monate her #102 von FlowHeater-Team
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
  • Benutzer
Mehr
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.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
14 Jahre 2 Monate her #150 von FlowHeater-Team
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.
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
  • Benutzer
Mehr
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

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Ladezeit der Seite: 0.300 Sekunden
FlowHeater Logo

FlowHeater - Der Daten Spezialist

Effiziente Datenintegration und Transformation mit FlowHeater - Ihre Lösung für nahtlosen Datentransfer.

Rechtliches

Support & Kontakt

Kontaktinformation

Telefon:
0951 / 99339792

E-Mail:
Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.


Copyright © 2009-2024 by FlowHeater GmbH. Alle Rechte vorbehalten.