2010-03-01 4 views
3

J'utilise Unmanaged Exports pour créer un fichier .dll natif à partir de .NET .dll afin que je puisse accéder au code .NET à partir de Delphi sans enregistrement COM.FoxPro et .NET COM sans enregistrement

Par exemple, j'ai cet ensemble de .NET:

using System; 
using System.Collections.Generic; 
using System.Text; 
using RGiesecke.DllExport; 
using System.Runtime.InteropServices; 

namespace DelphiNET 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31")] 
    public interface IDotNetAdder 
    { 
     int Add3(int left); 
    } 

    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class DotNetAdder : DelphiNET.IDotNetAdder 
    { 
     public int Add3(int left) 
     { 
     return left + 3; 
     } 
    } 

    internal static class UnmanagedExports 
    { 
     [DllExport("createdotnetadder", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] 
     static void CreateDotNetAdderInstance([MarshalAs(UnmanagedType.Interface)]out IDotNetAdder instance) 
     { 
     instance = new DotNetAdder(); 
     } 
    } 
} 

Lorsque je définis la même interface Delphi, je peux facilement utiliser l'objet .NET:

type 
    IDotNetAdder = interface 
    ['{ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31}'] 
    function Add3(left : Integer) : Integer; safecall; 
    end; 

procedure CreateDotNetAdder(out instance : IDotNetAdder); stdcall; 
    external 'DelphiNET' name 'createdotnetadder'; 

var 
    adder : IDotNetAdder; 
begin 
    try 
    CreateDotNetAdder(adder); 
    Writeln('4 + 3 = ', adder.Add3(4)); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

Voir ma Delphi question and answers pour plus de détails .

Ma question:
est quelque chose comme cela possible dans FoxPro? J'ai essayé ceci qui échoue avec incompatibilité de type de données erreur sur la ligne createdotnetadder(@ldnw):

DECLARE createdotnetadder IN DelphiNET.dll object @ ldnw 
ldnw = 0 
createdotnetadder(@ldnw) 
loObject = SYS(3096, ldnw) 
? loObject.Add3(4) 

Puis-je définir l'interface dans FoxPro De même que je l'ai fait dans Delphi? Sinon, puis-je utiliser ce fichier .dll à partir de FoxPro? J'utilise Visual FoxPro 9.0 SP2. Merci.

+0

Rick Strahl a un bon article sur VFP COM Interop ici: http://www.west-wind.com/presentations/VfpDotNetInterop/DotNetFromVFP.asp –

+0

@Brian: Je connais les pages de Rick. Je voulais éviter l'enregistrement COM mais il semble que ce n'est pas possible dans FoxPro. –

Répondre

1

Il semble que l'approche la plus simple consiste à utiliser COM Registration. L'approche alternative consiste à héberger manuellement le CLR. Rick Strahl a un poste vaste sur la façon dont le font-de FoxPro:

http://www.west-wind.com/wconnect/weblog/ShowEntry.blog?id=631

+0

Malheureusement, l'hébergement CLR ne fonctionne pas pour moi. Le code .NET utilise de manière intensive les threads et j'ai obtenu l'exception Loader Lock lors de la fermeture de l'application foxpro. –

+0

Eh bien alors vous voulez probablement héberger le CLR hors processus. Vous avez mentionné dans votre Q que Delphi/UnmangedExports fonctionnait - est-ce en cours d'exécution ou en cours de processus? –

+0

Delphi était en cours mais vous avez dû modifier la gestion des exceptions à virgule flottante. Quoi qu'il en soit, je suis passé à COM - c'est plus facile même si j'ai peur des problèmes d'enregistrement sur les ordinateurs des utilisateurs. –

0

Vous pouvez également utiliser l'open source wwDotnetBridge project qui automatise les processus d'hébergement d'exécution CLR pour vous et fournit une foule d'autres fonctions de soutien qui font il est plus facile de consommer des types et des structures .NET dans FoxPro.

loBridge = CREATEOBJECT("wwDotnetBridge","V4") 
loBridge.LoadAssembly("MyAssembly.dll") 
loInstance = loBridge.CreateInstance("MyNamespace.MyClass") 

loInstance.DoSomething(parm1) 
loBridge.InvokeMethod(loInstance,"SomeOtherMethodWithUnsupportedTypeParms",int(10)) 

wwDotnetBridge gère la création d'objets pour vous et passe en arrière instance COM comme interop COM natif fait, mais il offre des fonctionnalités supplémentaires ne sont pas accessibles via COM Interop:

  • L'accès aux méthodes et aux membres statiques
  • Accès aux types de valeur
  • appui à la mise à jour des tableaux et collections
  • soutien aux méthodes et constructeurs surchargées
  • L'accès aux types génériques

et beaucoup d'aides pour vous permettre de travailler autour des limites de la COM -.> Mappings NET fournis.

Questions connexes