2008-11-03 6 views
12

Ich habe mit einigen .NET-Code aus einem Delphi-Programm untersucht, ich muss mein Programm mit .net Assemblies und vordefinierten Funktionen erweiterbar machen (ich unterstütze bereits normale DLLs).Hosten der .NET-Laufzeit in einem Delphi-Programm

Nach vielen Online-Suche fand ich Managed-VCL, aber ich bin nicht bereit, $ 250 für das, was ich brauche, zu bezahlen, fand ich auch einige Newsgroups mit Code, der unvollständig ist und nicht funktioniert.

Ich benutze Delphi 2007 für win32. Was kann ich verwenden, um eine Funktion dynamisch aus einer Baugruppe mit vordefinierten Parametern auszuführen?

Etwas wie:

procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant); 

Ich möchte nur hinzufügen, dass ich brauche eine beliebige Baugruppen laden können (vielleicht alle Baugruppen in einem bestimmten Ordner), so dass C# Wrapper Erstellung möglicherweise nicht.

Antwort

7

Im Jedi Code Library (JCL) - kostenlos - eine JclDotNet.pas ist, eine Klasse TJclClrHost enthält, wahrscheinlich zu tun, was Sie wollen:

TJclClrHost = class(TJclClrBase, ICorRuntimeHost) 
    private 
    FDefaultInterface: ICorRuntimeHost; 
    FAppDomains: TObjectList; 
    procedure EnumAppDomains; 
    function GetAppDomain(const Idx: Integer): TJclClrAppDomain; 
    function GetAppDomainCount: Integer; 
    function GetDefaultAppDomain: IJclClrAppDomain; 
    function GetCurrentAppDomain: IJclClrAppDomain; 
    protected 
    function AddAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
    function RemoveAppDomain(const AppDomain: TJclClrAppDomain): Integer; 
    public 
    constructor Create(const ClrVer: WideString = ''; 
     const Flavor: TJclClrHostFlavor = hfWorkStation; 
     const ConcurrentGC: Boolean = True; 
     const LoaderFlags: TJclClrHostLoaderFlags = [hlOptSingleDomain]); 
    destructor Destroy; override; 
    procedure Start; 
    procedure Stop; 
    procedure Refresh; 
    function CreateDomainSetup: TJclClrAppDomainSetup; 
    function CreateAppDomain(const Name: WideString; 
     const Setup: TJclClrAppDomainSetup = nil; 
     const Evidence: IJclClrEvidence = nil): TJclClrAppDomain; 
    function FindAppDomain(const Intf: IJclClrAppDomain; var Ret: TJclClrAppDomain): Boolean; overload; 
    function FindAppDomain(const Name: WideString; var Ret: TJclClrAppDomain): Boolean; overload; 
    class function CorSystemDirectory: WideString; 
    class function CorVersion: WideString; 
    class function CorRequiredVersion: WideString; 
    class procedure GetClrVersions(VersionNames: TWideStrings); overload; 
    class procedure GetClrVersions(VersionNames: TStrings); overload; 
    property DefaultInterface: ICorRuntimeHost read FDefaultInterface implements ICorRuntimeHost; 
    property AppDomains[const Idx: Integer]: TJclClrAppDomain read GetAppDomain; default; 
    property AppDomainCount: Integer read GetAppDomainCount; 
    property DefaultAppDomain: IJclClrAppDomain read GetDefaultAppDomain; 
    property CurrentAppDomain: IJclClrAppDomain read GetCurrentAppDomain; 
    end; 
+4

Bin ich blind oder gibt es kein Beispiel wie man es benutzt? –

2

können Sie .NET-Klassen verwenden als COM-Objekte in Delphi:

  • Montage in C# erstellen
  • für die Montage

Jetzt

  • Importart Bibliothek in Delphi-Typbibliothek erstellen Sie kann auf Klassen von .NET-Assemblys zugreifen, die in der Typbibliothek exportiert werden.

  • 6

    Ich kann Ihnen aus erster Hand sagen, dass die Zusammenarbeit mit .Net von Delphi kein Zuckerschlecken ist. Ich bin ein .Net-Typ, arbeitete aber für eine Weile in einem .Net- und Delphi-Shop. Ich habe mehrere Projekte verwaltet, die in .Net (WinForms und WPF) geschrieben wurden, aber von Delphi aufgerufen wurden. Unsere Delphi-Leute hatten eine Interop-Ebene geschrieben, auf der Delphi die .Net-Bibliotheken aufrufen konnte, da alle unsere neuen Produkte in .Net geschrieben wurden. Es war ein Problem für uns (und das waren gute Delphi-Entwickler). Wenn wir eine gute 3rd-Party-Bibliothek gekauft hätten, um die Interop für uns zu machen, wäre es mehr als wert gewesen. Ich wette, wir haben tausende von Dollars in Mannstunden ausgegeben, um Probleme mit der Interop von Delphi nach .Net zu schreiben und zu debuggen.

    Ich würde diese Managed-VLC-Bibliothek für eine Testfahrt nehmen, um zu sehen, wie gut es funktioniert. Wenn es seiner Werbung gerecht wird, dann ist es leicht die $ 250 wert.

    7

    Das Hosting der CLR selbst ist nicht so schwierig (besonders wenn Sie nur eine einzelne AppDomain verwenden). Sie können die COM-basierten Hosting-APIs zum Starten der Laufzeit, zum Laden von Assemblys, zum Erstellen von Objekten und zum Aufrufen von Methoden verwenden.

    Es gibt viele Informationen online, zum Beispiel die MSDN-Dokumentation zu "Hosting the Common Language Runtime".

    +0

    Ich bekomme eine 'Datei oder Assembly konnte nicht geladen werden 'RGiesecke.DllExport.Metadata, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = ad5f9f4a55b5020b' oder eine seiner Abhängigkeiten. Das System kann die angegebene Datei nicht finden. "Ich verwende dieses Paket wegen" [DllExport] "Annotation. Frage [hier] (http://stackoverflow.com/q/23383839/675577) – dialex

    3

    Ich hatte genau dasselbe Problem. Ich arbeitete in einem Delphi-Shop und wollte mit einer älteren Delphi-App Funktionalität mit .NET und C# hinzufügen. Ich schaute auf Managed-VLC und ich beschloss, es zu überspringen, da ich das Gefühl hatte, dass es ernsthafte Probleme gab. Ich habe hier etwas viel Einfacheres gefunden: Delphi.NET. Hinweis: Dies ist nicht die Version von Delphi, die nativ auf .NET ausgeführt wird. Dies ist ein Open-Source-Projekt, mit dem ältere Delphi-Apps über COM und Reflektion auf die .NET-Funktionalität zugreifen können. Obwohl es alt ist, funktioniert es wie ein Charme, da es COM verwendet. Ich werde überprüfen, ob es mit .NET 2.0 und 3.5 funktioniert. Ich habe .NET DLL's in Tagen in Delphi 5 integriert. Mein Chef dachte, ich wäre ein Superheld. Viel Glück!

    2

    Sie könnten Delphi für .Net und unmanaged Exporte, auch als reverse P/Invoke genannt.

    Damit können Sie im Wesentlichen eine .NET-DLL erstellen, die vollständigen Zugriff auf das .NET-Framework hat, aber von jeder beliebigen Landessprache geladen werden kann, genau wie bei jeder .dll und ohne den Overhead von com interop.

    Hier ist ein einfaches Beispiel: http://cc.codegear.com/Item/22688

    4

    Siehe my question für Ende-zu-Ende-Beispiel für das Hosting von CLR in Delphi mit JCL.