Entwickler-Ecke

Dateizugriff - C# dll zur Laufzeit einbinden


marius99 - Do 03.03.11 13:45
Titel: C# dll zur Laufzeit einbinden
Hallo,

ich habe viel zum Thema gefunden, leider keine Antworten.

Ich möchte in C# eine Library erstellen und diese ohne COM-Objekt zur Laufzeit einbinden. Geht das überhaupt?

Beispiel der Dll:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
   public class Class1
   {
      public string Test( string param ) 
      {
         Form1 TestForm = new Form1();
         TestForm.ShowDialog();
         return param;
      }        
   }
}


Wie binde ich die nun in Delphi ein?

Hatte es so mal versucht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
...
Type TFNOneFunction = function(param: String): stringstdcall;
...
Var
  myfunction : TFNOneFunction;
  myDLLhandle : Thandle;
begin
  myDLLhandle:=LoadLibrary('ClassLibrary1.dll');
  myfunction := nil;
  If myDLLhandle <> 0  then
  begin
    @myfunction := GetProcAddress(myDLLhandle,'ClassLibrary1.Class1.Test'); // hier auch schon nur mit Test versucht
    If @myfunction <> nil then
      myfunction('test')
    else
      showmessage('error');

    FreeLibrary(myDLLhandle);
  end
  else
    showmessage('error');
  end;


Geht leider nicht. Wie macht man es denn richtig?

Gruß Marius


Kha - Do 03.03.11 15:06

:welcome: in der EE!

Siehe z.B. http://delphi-forum.de/viewtopic.php?p=608359#608359.


marius99 - Do 03.03.11 16:06

Vielen Dank für die Hilfe. Habe jetzt meine DLL umgebaut. Allerdings funktioniert der Aufruf in Delphi noch immer nicht...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
   public class Class1
   {
      [DllExport( "Test", CallingConvention = CallingConvention.StdCall )]
      public static string Test( string param ) 
      {
         Form1 TestForm = new Form1();
         TestForm.ShowDialog();
         return param;
      }


Kha - Do 03.03.11 16:30

Den MSBuild-Task hast du aber schon hinzugefügt?


marius99 - Do 03.03.11 16:37

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Den MSBuild-Task hast du aber schon hinzugefügt?


Nein, habe mir jetzt mal die Vorlage von Robert Giesecke geholt. Damit bin ich schon einen Schritt weiter. Habe jetzt zwar eine Zugriffsverletzung, aber das ist ja immerhin schon mal was. :D