2010-04-02 4 views
4

Comment delphi7 accès C# .net géré dll?accès DLL de code managé (CLR) avec Delphi 7

J'essaie d'accéder à une DLL qui a compilé en C# et ils ne sont pas ceux de style ancien DLL. (Je n'ai pas source pour les DLL)

je ne ai essayé de recherche en ligne, mais ils sont confus. Je suppose qu'il y a une certaine limite, même si vous pouvez y accéder avec D7 ..

merci.

+0

Est ce que le C# .net configuration dll réussi à être un com accessible? – Erin

Répondre

5

@AngryHacker, Pour ce que vous avez suggéré être vrai, l'assembly .NET doit être marqué avec l'attribut ComVisibleAttribute (Enregistrer pour l'option COM Interop activée), et exposer chaque fonction à COM en utilisant [ComVisible (true)] .

Si vous essayez d'utiliser un assemblage tiers (que vous n'avez pas écrit), vous devez vérifier auprès du vendeur si cette assemblée peut être utilisé par COM.

L'assembly n'a pas non plus besoin d'être fort nommé pour être accessible via COM.

Si vous ne voulez pas aller le chemin COM, consultez CrossTalk pour Delphi: http://www.atozed.com/CrossTalk/Docs/index.EN.aspx

1

Delphi7 les accès géré DLL de la même manière que toute autre langue basée sur COM (comme VB6).

L'exercice de base est la suivante:

  1. Assurez-vous que votre .NET est nom fort.
  2. courir par regasm
  3. Laisse tomber dans le GAC

Maintenant Delphi7 devrait être en mesure de référencer le fichier TLB qui a été généré par regasm comme il le ferait tout autre DLL basée sur COM.

1

Vous pouvez essayer d'utiliser le "Inverse P/Invoke" trick comme décrit par Brian Long il y a longtemps.

Ce truc n'a pas besoin ComVisible (vous devriez pouvoir l'utiliser sans changer les sources de l'ensemble de .NET).

--jeroen

0

Si vous n'avez pas la possibilité de changer la source de la DLL d'origine, vous pouvez écrire un proxy en C# ou d'un prisme qui expose une interface com que vous pouvez utiliser dans votre projet. L'avantage de cette approche est que vous pouvez personnaliser chaque appel pour n'utiliser que des types spécifiques que vous pouvez gérer facilement.

1

Ce n'est pas difficile du tout. Vous n'avez pas besoin de "regasm" si vous ne le souhaitez pas. Vous n'avez même pas à enregistrer quoi que ce soit COM-ish du tout.

Vous seriez mieux servi en créant un wrapper en C# ou un autre langage géré. Oh et assurez-vous que vos classes sont ComVisible (vrai). Ce thread de débordement de pile le résume assez bien, et il contient un ensemble d'exemples pour différents scénarios. Hosting CLR in Delphi with/without JCL - example