AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi C#.Net2.0 DLL in Delphi2007 nutzen (Com)?
Thema durchsuchen
Ansicht
Themen-Optionen

C#.Net2.0 DLL in Delphi2007 nutzen (Com)?

Offene Frage von "winx"
Ein Thema von winx · begonnen am 13. Feb 2008 · letzter Beitrag vom 13. Feb 2008
 
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: C#.Net2.0 DLL in Delphi2007 nutzen (Com)?

  Alt 13. Feb 2008, 10:12
Zitat von winx:
Wo liegt noch mein Fehler?
Erstmal ist ein Fehler, dass wir deine Eigenschaften und Methoden von "Utility" nicht sehen können, somit können wir dir unmöglich sagen, ob die COM-compatibel sind.

Zitat:
Nun möchte ich das gerne in Delphi einbinden und das klappt auch.
Nur sehe ich nur die Klassen, aber keine Properties und Funktionen...
Per default veröffentlicht .Net Klassen zu COM nur als IDispatch.
Das heißt, du schreibst die Methoden und Properties einfach so in den Delphi-Code, und hoffst dass sie richtig geschrieben sind.
Falls Namen und Parameter stimmen, dann werden die richtigen Methoden in den .Net Klassen ausgeführt.
Natürlich ist das furchtbar, aber Late-binding ist immer furchtbar.

Um eine richtige COM-Typelib aus deiner Assembly generieren zu können, musst du für alle zu exportierenden Klassen ein Interface anlegen.
Dieses Interface braucht dann noch eine GUID, und du musst ihm sagen, dass es auch wirklich Early Binding unterstützen soll.
Am besten ist hier "InterfaceIsDual", da du sowohl Early Binding hast, als auch Late Binding für die ganzen VB-*piep* da draußen.
Außerdem solltest du ComVisible für die Assembly auf false setzen, un nur für einzelne Typen einschalten.
Du willst ja nur ein Subset der Assembly für COM sichtbar machen, die meisten dinge würde nämlich gar nicht einfach so in COM laufen...

Bleistift(Chrome, kein D.Net):
Delphi-Quellcode:
type
  [ComVisible(true)]
  [Guid("5E95FD65-3125-4494-AC8C-A1AFF186AA04")]
  [InterfaceType(ComInterfaceType.InterfaceIsDual)]
  ISample = public interface
     // DispId is wichtig, da sonst in späteren Versionen
     // die falsche Methode aufgerufen werden könnte
    [DispId(0)]
    property SomeValue : String read write;
    [DispId(1)]
    method AddToSomeValue(someString : String);
  end;

  [ComVisible(true)]
  [ComDefaultInterface(typeOf(ISample))]
  Sample = public class(ISample)
  public
    property SomeValue: System.String;
    method AddToSomeValue(someString: System.String);

    constructor; empty;
    constructor(someValue : String);
  end;
  
implementation

constructor Sample(someValue : String);
begin
  self.SomeValue := someValue;
end;

method Sample.AddToSomeValue(someString : System.String);
begin
  SomeValue := SomeValue + someString;
end;
Das lässt sich dann so in Delphi benutzen:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  ClassLibrary1_TLB;
var
  test : TSample;
begin
  CoInitialize(nil);
  test := TSample.Create(nil);
  test.SomeValue := 'abc';
  test.AddToSomeValue('def');

  Writeln(test.SomeValue);
end.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
 


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 06:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz