2011-01-09 7 views
13

ho un compito semplice:Come utilizzare un. Assieme Netto in Delphi senza registrarlo in GAC o COM?

è possibile scrivere una DLL Delphi e mettere un. Assieme Net (con una sola interfaccia con 4 metodi e una classe che implementa l'interfaccia) oltre a esso e chiamarlo dalla DLL Delphi ?

Voglio dire, posso importare i tipi .Net direttamente dall'assembly .Net (nome file relativo) se creo un'unità tlb e una delphi per il tlb, senza registrare Assembly/tlb?

migliore, thalm

EDIT (quello che ho trovato):

La maggior parte delle soluzioni devono registrare almeno una dll/tlb per COM. Ma la cosa più promettente che ho trovato era: Unmanaged Exports da Robert Giesecke, è un modello di progetto di Visual Studio, che permette di scrivere statica C# (o qualunque linguaggio .Net) metodi e li chiamate da qualsiasi lingua non gestito, impressionante:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

EDIT 2: Funziona davvero! Puoi persino controllare il tipo di marshalling, non credibile !!!

+1

Nice hack che trova +1. Quasi immediatamente ha avuto senso una volta ricordato che l'intestazione .Net è solo un'estensione del formato COFF. Ho avuto un ottimo articolo con i dettagli delle posizioni .Net ma non riesco a trovarlo ora. Qui è forse anche il modo migliore (non più semplice) per farlo: http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx – user44298

+0

cont. Un'altra utilità utile che ho trovato grazie alla ricerca nella tua soluzione che potrebbe essere utile ai visitatori http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx – user44298

+0

@Ivo, questo è solo il modo comune di ospitare CLR e utilizzare l'interoperabilità COM tramite mscoree per accedere ai tuoi tipi. (Non sono sicuro se anche un articolo codeproject sia veramente utile per qualcosa che è già documentato su msdn http://msdn.microsoft.com/en-us/library/dd380850.aspx) Questo è perfettamente adatto per molti casi d'uso, soprattutto se vuoi qualcosa di più dei semplici metodi e usa un linguaggio che abbia una buona gestione della COM come C++ o Delphi. Non ti aiuta quando devi avere una "vera" DLL. ;-) –

risposta

5

Un piccolo consiglio: non è necessario rendere pubbliche le esportazioni.

La tua classe è già interna, quindi non verrebbe visualizzata se consumata da un altro assieme.

Tuttavia, è anche perfettamente perfetto aggiungere un'esportazione a una classe statica esistente, ma dichiararla come privata in modo che non venga visualizzata quando viene utilizzata da .Net. (Le esportazioni non gestite tendono a sembrare un po 'inquietanti)

0

È possibile farlo utilizzando la registrazione gratuita COM. Vedere la mia risposta a una domanda su Registrazione gratuita com here. Con un assembly .NET, è necessario rendere COMVisible le proprie interfacce e metodi, come se si stesse utilizzando l'oggetto utilizzando la COM registrata. Se segui la mia risposta sulla domanda che ho appena menzionato, dovresti essere in grado di mettere la dll fianco a fianco. L'unica differenza è che è necessario inserire le informazioni nel manifest assembly (quello gestito) sulle classi COM che si stanno esportando. Se si guarda la documentazione sul sito microsoft riguardante i manifesti dell'applicazione e di assemblaggio, si dovrebbe scoprire come farlo. L'attributo manifest che stai cercando è CLRClass. Se tutto è configurato correttamente, basta mettere la DLL gestita parallelamente al file eseguibile chiamante e tutto funziona.