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.