Thema: C# C# DLL Tutorial?

Einzelnen Beitrag anzeigen

Elvis

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

Re: C# DLL Tutorial?

  Alt 23. Jul 2009, 10:59
Zitat von Phoenix:
Wenn Du eine C#-Dll (also ein Assembly) aus Delphi heraus aufrufen willst, dann hast Du ein Problem. So einfach geht das nämlich nicht, eine .NET Anwendung aus nativem Code anzusprechen. Das Stichwort wäre reverse P/Invoke, und ich bin ganz ehrlich: Ich arbeite ungeheuer viel mit .Net, und das habe ich noch nie tauglich hinbekommen, obwohl ich mich mehrere Wochen damit beschäftigt habe.
Was geht denn nicht?
Schaue mal den Beitrag hier an. Damit kann man das mit jeder .Net Sprache machen, die Attribute und MSBuild unterstützt.
Zitat von Phoenix:
C#-Kompilate sind Assemblies. Das ist kein x86-Code, den Delphi importieren könnte. In der DLL liegt sogenannter IL-Code (Intermediate Language-Code, vergleichbar mit Java Bytecode), und dieser IL-Code muss erst in Assemblercode übersetzt werden damit er laufen kann.
Delphi kann den IL-Code nicht übersetzen, kann daher also keine .NET Assembly .dll aufrufen.
Äpfel und Birnen. Zum Laden einer .Net Assembly muss Windows nur wissen, wie es passieren soll.
IOW: Soll COM benutzt werden oder ist die Assembly Mixed-Mode mit einer korrekten Exporttabelle.
Ob der eigentliche Code nun in IL geschrieben wurde oder nicht ist für den konsumierenden Prozess absolut transparent.
Der wirkliche Unterschied ist, dass COM Interop auch mit normalen "AnyCPU" Assemblies geht, ie ja gar keine DLLs sind. Während klassische DLL-Exports nur mit Assebmlies geht, die auf eine CPU-Platform fixiert sind. Das sind dann aber auch richtige DLLs, bis auf die Tatsache, dass sie innen auch ein bissel IL enthalten.
Zitat von Phoenix:
Das geht nicht so einfach. Ich würde es ehrlich gesagt sein lassen, wenn Du nicht mehrere Wochen an Research da reinstecken willst.
Er müsste nur das Archiv aus dem Beitrag oben in sein Projekt entpacken und wie dort beschrieben eine Zeile in seine Projektdatei hinzufügen.

Danach kann er das einfach so machen:
Code:
public class Class1 

  [DllExport("ausCSharp", CallingConvention = CallingConvention.StdCall)]
  public static int tex(int t)
  { 
    t += 1;
    return t;
  } 
}
function ausCSharp(t:integer):integer; stdcall; external 'DieDotNetAssembly.dll'; Da ist auch kein Hack oder irgendein fieser Trick involviert.
Ich nutze dafür die dokumentierte Infrastruktur/API, die MSFT für C++/CLI oder andere mixed-mode Sprachen in die CLR integriert hat. (Ist ein .Net-only feature, Mono kann das nicht)
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