AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

c# DLL .NET in DELPHI32 nutzen

Ein Thema von hgiel · begonnen am 22. Sep 2008 · letzter Beitrag vom 12. Jul 2010
Antwort Antwort
Seite 1 von 3  1 23      
hgiel

Registriert seit: 4. Apr 2005
61 Beiträge
 
#1

c# DLL .NET in DELPHI32 nutzen

  Alt 22. Sep 2008, 13:24
Hallo,

ich habe ein dokumentierte .NET-DLL, die ich in DELPHI 7 unter Win32 nutzen möchte:

Sie liegt als COM-Wrapper??? bzw. als .Net Assembly ??? vor:

1) meinedll.COM.dll
2) meiendll.COM.tlb
3) meinedll.dll

In der Doku wird von Namensräumen und ihren Eigenschaften gesprochen!

Ich habe keine Ahnung wie ich diese DLLs einbinden und dann nutzen kann ;-((

Um das konkret zu machen:

Ein Namensraum lautet "Version" und besitzt die Eigenschaft "Major" Typ: int

Ich würde nun gerne den Zugriff testen, in dem ich per ButtonClick diese Eigenschaft auslese und als inttostr(Version.Major????) in einem Edit-Feld anzeige!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 22. Sep 2008, 13:46
Wenn ein COM-Wrapper vorliegt, und dieser das ist, was ich vermute, würde ich mich unter Delphi32 mal ganz schnell darauf (also auf die xxx.COM.DLL) stürzen.

Versuch doch mal die TypBibliothek zu importieren (irgendwo im Delphi-Menu)!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von rweinzierl
rweinzierl

Registriert seit: 22. Mär 2005
98 Beiträge
 
#3

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 22. Sep 2008, 13:48
Hallo


Dot.Net Dlls unterscheiden sich grundsätzlich von normalen Delphi bzw. C++ DLL's aus der WIN32 Welt.

Bei einer Win32.dll stellt die DLL einen Satz an funktionen bereit die im Prenzip von jeder Sprache aus aufgerufen werden können.

Bei einer C# DLL funktiert ganz anders.
Dort liegen die Funkionen als vorkopmpilierter Quellcode vor und benötigen unbedingt die Dot.Net Runtime.

==> Ein normaler Aufruf aus Delphi ist (fast) unmöglich.

Der Standard Weg den Microsoft empfiehlt ist der Umweg über .COM ( bzw AcitveX)
( Hat halt den Nachteil das alles wieder durch die Registry muss!)

Im Internet findet man auch eine Methode die dot.net Runtime komplett in den eigenen Prozess zu laden, und von dort aus die c# DLL wieder anzusprechen ==> Ist aber (meiner Meinung nach) nur etwas für absolute Experten.

Als Bastellösung kann man noch eine Anwendung in c# schreiben ( diese kann die DLL ohne Probleme Laden), und kommuniziert über eine selber ausgedachte Schnittstelle (Socket, Named Pipes, Mapped Memory ....)

von Remobjects gibts ein Produkt names Hydra, auch damit sollte so etwas möglich sein ( noch nicht getestet)

==> An einer besseren Veriante wäre auch ich interessiert.

mfg

Reinhold Weinzierl
  Mit Zitat antworten Zitat
hgiel

Registriert seit: 4. Apr 2005
61 Beiträge
 
#4

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 23. Sep 2008, 10:01
Hallo,

vielen Dank für die Infos

ich habe die COM.TLB überdie Typbibliothek importiert und auch eine entsprechende UNIT erzeugt, die ich nun in das Programm unter USES impementiert habe:

Ausschnitt aus der NEUEN LIB-Unit:
Delphi-Quellcode:
interface

uses Windows, ActiveX, Classes, Graphics, mscorlib_TLB, OleServer, StdVCL, Variants;
  


// *********************************************************************//
// In dieser Typbibliothek deklarierte GUIDS . Es werden folgende
// Präfixe verwendet:
// Typbibliotheken : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Nicht-DISP-Schnittstellen: IID_xxxx
// *********************************************************************//
const
  // Haupt- und Nebenversionen der Typbibliothek
  Sts_Db_SiZ_Usb_ComMajorVersion = 1;
  Sts_Db_SiZ_Usb_ComMinorVersion = 0;

  LIBID_Sts_Db_SiZ_Usb_Com: TGUID = '{9D632297-83A7-3DCC-80D1-65E37EE18965}';

  IID_ISiZUsbCOM: TGUID = '{18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}';
  IID__SiZUsbCOM: TGUID = '{E3C6DF0A-23D3-38D1-810A-ED6BA2C8C241}';
  CLASS_SiZUsbCOM: TGUID = '{FBE6DA18-7BC9-4671-83F9-8D477D3DC39B}';
type

// *********************************************************************//
// Forward-Deklaration von in der Typbibliothek definierten Typen
// *********************************************************************//
  ISiZUsbCOM = interface;
  ISiZUsbCOMDisp = dispinterface;
  _SiZUsbCOM = interface;
  _SiZUsbCOMDisp = dispinterface;

// *********************************************************************//
// Deklaration von in der Typbibliothek definierten CoClasses
// (HINWEIS: Hier wird jede CoClass zu ihrer Standardschnittstelle
// zugewiesen)
// *********************************************************************//
  SiZUsbCOM = _SiZUsbCOM;


// *********************************************************************//
// Schnittstelle: ISiZUsbCOM
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}
// *********************************************************************//
  ISiZUsbCOM = interface(IDispatch)
    ['{18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}']
    function Get_Version_Major: Integer; safecall;
    function Get_Version_Minor: Integer; safecall;
    function Get_Version_Build: Integer; safecall;


....


Leider kann ich noch nicht auf die Funktionen - z.B. Get_Version_Major - aus der Bibliothek zugreifen:

Fehler "Ungenügende Forward oder external - Deklaration"!!!

Ausschnitt aus meinem Programm:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sts_Db_SiZ_Usb_Com_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

function Get_Version_Major: Integer; safecall;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(inttostr(Get_Version_Major));
end;

...
Wahrscheinlich habe ich nur ein Brett vorm Kopf und der Zugriff ist ganz leicht zu bewerkstelligen???

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen! - Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 23. Sep 2008, 19:04
Hi,

Entschuldigung: Schon mal mit Interfaces oder ActieX programmiert?

In der Unit einen
Delphi-Quellcode:
initialization
  CoInitialize(nil);

finalization
  CoUninitialize;
schreiben, dann sollte es auch mit dem TLB-Import Funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 23. Sep 2008, 19:21
Zitat von Alter Mann:
Hi,

Entschuldigung: Schon mal mit Interfaces oder ActieX programmiert?

In der Unit einen
Delphi-Quellcode:
initialization
  CoInitialize(nil);

finalization
  CoUninitialize;
schreiben, dann sollte es auch mit dem TLB-Import Funktionieren.
Solange die TLB eingebunden ist, ist das für den MainThread bereits erledigt.


Aber mit Interfaces umgehen, musst du noch lernen.
Also (nur eine mögliche Variante):
  1. Du bindest die TLB unter Uses ein (wenn es nicht schon der Fall ist)
  2. Du definierst dir eine Variable vom benötigten Interface (bspw: var myIntf:ISiZUsbCOM)
  3. Du initialisierst an gegebener Stelle das Interface mit Hilfe der CoClass (bsp: myIntf:=coSiZUsbCOM.create
  4. jetzt rufst du die Funktionen auf (myIntf.get_major_version)
Alles andere lässt du erstmal weg. Das wie gesagt nur ein Weg, die TLB bietet auch noch mehr Möglichkeiten. Nebenbei: Das Interface wird automatisch freigegeben, brauchst du dich nicht darum kümmern.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
hgiel

Registriert seit: 4. Apr 2005
61 Beiträge
 
#7

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 24. Sep 2008, 15:51
Hallo,

vielen Dank für den Input - es ist wahr ich muss mich wirklich mal intensiver um INTERFACE-Prog kümmern ;-(

Die Hinweise von Sirius haben mir insofern geholfen, dass ich nunmehr immerhin schon mal die Funktionen, Properties - rein vom Codevervollständiger - sehen und "nutzen" kann.

Leider gibt es noch eine Fehlermeldung: Klasse nicht registriert! bzw. eine Zugriffsverletzung...!

Hier mal mein Code zum gucken und ausserdem habe ich auch die DLL-Unit mit rangehängt:

unit Unit1;
Delphi-Quellcode:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sts_Db_SiZ_Usb_Com_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  myIntf1: _SiZUsbCOM; //Interface

  myIntf2: ISizUsbCOM; //Interface *

// myIntf3: _SiZUsbCOMDisp; //DispInterface - Warnungshinweis plattformspezifisch

// myIntf4: ISizUsbCOMDisp; //DispInterface - Warnungshinweis plattformspezifisch

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin
  myIntf1:=coSiZUsbCOM.create; // -> Fehlermeldung Klasse nicht registriert!
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  testzahl: integer;
begin
  testzahl:= myIntf2.Version_Major; // -> Fehlermeldung Zugriffsverletzung
  showmessage(inttostr(testzahl));
  if myIntf2.TrueCryptExists then showmessage('JA') else showmessage('Nein'); // -> hier auch Fehlermeldung Zugriffsverletzung
end;

end.
[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]
Angehängte Dateien
Dateityp: pas sts_db_siz_usb_com_tlb_164.pas (13,4 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 24. Sep 2008, 17:38
Du hast auch soweit alles richtig gemacht. Bis auf, das du globale Variablen definiert hast (myIntfx). Nimm die doch bitte in eine Klasse (zB. zu TForm1 unter private Deklarationen)
Und noch dazu:
Zitat:
Fehlermeldung Klasse nicht registriert!
Tja, sieht so aus, als hättest du die Klasse noch nicht registriert in deinem System. (siehe regsvr32; was normalerweise eine Installation macht)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von EDE
EDE

Registriert seit: 3. Jan 2006
Ort: Schlüsselfeld
8 Beiträge
 
Delphi 2007 Professional
 
#9

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 25. Sep 2008, 18:42
Hallo Leute,

ich muss mich hier mal anhängen.

Seit geraumer zeit bin ich SecondLife verfallen und such eine möglichkeit die libsecondlife.dll in die Win32welt von Delphi zu bekommen.

libsecondlife.dll ist in C# für .Net gecodet und OpenSource. Guggst du hier

Alles was passiert das mir Delphi2007 beim Importieren von .Net eine mscorlib_TLB.pas erstellt und sich aufhängt.

Ich habe es auch mit Delphi2006 versucht das kann aber kein .Net 2.0

Wenn jemand Rat weis oder vieleicht es schon gemacht hat wer einfach super.

Besten Dank schon mal im Vorraus
Eduard Demont
Falls du einen Rechtschreibfehler finden solltest kannst du ihn behalten
  Mit Zitat antworten Zitat
gvita

Registriert seit: 28. Okt 2004
10 Beiträge
 
#10

Re: c# DLL .NET in DELPHI32 nutzen

  Alt 25. Sep 2008, 19:58
Hallo also mann kann aus manged code eine dll erzeugen mit der auch nicht .net sprachen arbeiten können als ob es eine normale dll wäre.

Guck mal

http://www.codeproject.com/KB/dotnet/DllExport.aspx

Gruß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz