2008-11-03 7 views
12

Je cherchais à utiliser du code .NET dans un programme Delphi, je devrais rendre mon programme extensible en utilisant des assemblages .net et des fonctions prédéfinies (je supporte déjà les DLL normales). Après beaucoup de recherches en ligne, j'ai trouvé Managed-VCL, mais je ne suis pas prêt à payer 250 $ pour ce dont j'ai besoin, j'ai aussi trouvé des newsgroups avec du code incomplet et qui ne fonctionne pas. J'utilise Delphi 2007 pour win32. Que puis-je utiliser pour exécuter dynamiquement une fonction à partir d'un assemblage avec des paramètres prédéfinis?Héberger l'environnement d'exécution .NET dans un programme Delphi

Quelque chose comme:

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

Je veux juste ajouter que je dois pouvoir charger un des ensembles arbitraires (peut-être tous les assemblages dans un dossier spécifique), créant ainsi une enveloppe C# peut ne pas fonctionner.

Répondre

7

Dans le Code Jedi Library (JCL) - gratuit - il y a un JclDotNet.pas, contenant une classe TJclClrHost, faisant sans doute ce que vous voulez:

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

Suis-je aveugle ou il n'y a aucun exemple comment l'utiliser? –

2

Vous pouvez utiliser les classes .NET comme des objets COM dans Delphi:

  • créer l'assemblage en C#
  • créer bibliothèque de types pour l'assemblage
  • bibliothèque de types d'importation dans Delphi

Maintenant, vous peut accéder aux classes de l'assembly .Net exportées dans la bibliothèque de types.

6

Je peux vous dire d'expérience que l'interopérabilité avec .Net de Delphi n'est pas un pique-nique. Je suis un gars .Net, mais j'ai travaillé dans un magasin .Net et Delphi pendant un moment. J'ai géré plusieurs projets qui ont été écrits en .Net (WinForms et WPF) mais ont été appelés par Delphi. Nos gars de Delphi avaient écrit une couche d'interopérabilité pour que Delphi puisse appeler les bibliothèques .Net puisque tous nos nouveaux produits étaient écrits en .Net. C'était un problème pour nous (et ceux-ci étaient de bons développeurs Delphi). Si nous avions pu acheter un bonne bibliothèque 3ème partie pour faire l'interop pour nous, il aurait été plus que la peine. Je parie que nous avons dépensé des milliers de dollars en heures de travail pour écrire et déboguer des problèmes avec l'interop de Delphi à .Net.

Je prendrais cette bibliothèque Managed-VLC pour un essai pour voir comment cela fonctionne bien. Si elle est à la hauteur de sa publicité, alors il vaut facilement la peine de 250 $.

7

L'hébergement du CLR vous-même n'est pas si difficile (surtout si vous n'utilisez qu'un seul AppDomain). Vous pouvez utiliser les API d'hébergement basées sur COM pour démarrer l'exécution, charger des assemblages, créer des objets et appeler des méthodes.

Il y a beaucoup d'informations en ligne, par exemple la documentation MSDN sur "Hosting the Common Language Runtime".

+0

Je reçois un 'Impossible de charger le fichier ou l'assemblage 'RGiesecke.DllExport.Metadata, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = ad5f9f4a55b5020b' ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. J'utilise ce paquet à cause de l'annotation [DllExport] '. Question [ici] (http://stackoverflow.com/q/23383839/675577) – dialex

3

J'ai eu exactement le même problème. J'ai travaillé dans un magasin Delphi et ils voulaient commencer à ajouter des fonctionnalités à une application Delphi héritée avec .NET et C#. J'ai regardé Managed-VLC et j'ai décidé de l'ignorer, car je sentais qu'il avait de sérieux problèmes. J'ai trouvé quelque chose de beaucoup plus simple ici: Delphi.NET. Note: ceci est et non la version de Delphi fonctionnant nativement sur .NET. Il s'agit d'un projet open source permettant aux applications Delphi héritées d'accéder à la fonctionnalité .NET via COM et la réflexion. Même s'il est ancien, il fonctionne comme un charme puisqu'il utilise COM. Je vais vérifier que cela fonctionne avec .NET 2.0 et 3.5. J'ai DLL .NET entièrement intégré dans notre ancienne application Delphi 5 en quelques jours. Mon patron pensait que j'étais un super-héros. Bonne chance!

2

Vous pouvez utiliser Delphi pour les exportations .Net et non managées, également appelées P/Invoke inversé. Cela vous permet essentiellement de créer un fichier .Net .dll qui a un accès complet au framework .Net, mais peut être chargé par n'importe quel langage natif, comme vous le feriez avec n'importe quel fichier .dll, et sans le surcoût de com interop.

Voici un exemple simple: http://cc.codegear.com/Item/22688

4

Voir my question pour l'exemple complet de l'hébergement CLR en Delphi avec JCL.

Questions connexes