2009-06-11 13 views
7

Ho creato una dll utilizzando la riga di comando (csc). Supponiamo che dll contenga il metodo Add (int, int). Ora voglio usare quella funzione di aggiunta in vC++ ??Come usare C# Dll in vC++?

Come fare questo?

Il vostro aiuto sarà molto apprezzato.

Ecco cosa sto facendo.

vcproj; per questo progetto ho il tasto destro del mouse e la sezione linker aggiungo dipendenze aggiuntive.aggiunto il percorso dove risiede dll.

main.cpp

using namespace Test 

void main() 

{ 

    demo d; 

    d.add(5,5); 

} 

errore namespace di prova non esiste.

Come risolvere questo?

ho bisogno di usare quella dll come nel codice non gestito

risposta

9

tuo montaggio C# ha bisogno l'attributo ComVisible (tra le poche altre cose).

[assembly: ComVisible(true)] 

C'è a guide to doing this here.

+2

Se l'applicazione C++ è gestita, è ovviamente ancora più semplice di questa ed è possibile evitare del tutto la COM. – Noldorin

+0

@Matthew Brindley ho fatto quello che viene fornito su http://support.microsoft.com/kb/828736 ma sto ricevendo un errore di non può convertire da 'const _GUID' a 'const IISWebFrameworkDAAB :: DataAccessInterface' "Cosa dovrei fare ? – user1402643

8

Dal forum MSDN Calling C# from unmanaged C++:

Che cosa si vuole fare sarebbe quella di compilare solo i file in cui si desidera per caricare il codice C#/CLR e quindi chiamare via con C++/CLI. Il resto della tua app rimarrà nativa mentre i file cp che compili/clr verranno mixati con nativo e CLR. Dovresti essere in grado di chiamare nella libreria C# utilizzando la sintassi C++/CLI .

Una volta che si lancia/CLR sulla riga di comando cl.exe per un file, all'interno di quel file , è possibile chiamare qualsiasi codice gestito che si desidera, indipendentemente dal fatto è stato scritto in VB.net, C# oppure C++/CLI. Questo è di gran lunga il modo più semplice per fare quello che vuoi fare (chiamare il codice C dalla tua app C++ nativa), sebbene abbia le sue limitazioni e le limitazioni . In linea di massima però "It Just Works". Inoltre, è più veloce di p/invoca.

2

Questo dipende molto dal tipo di applicazione C++ che si sta creando. Se si sta creando un assembly C++/CLI, è necessario assicurarsi che il progetto abbia un riferimento alla DLL C#. Una volta fatto, dovresti essere in grado di digitare il codice come scritto assump hai una definizione di Demo come tale.

namespace Test { 
    public class demo { 
    public void add(int left, int right) { 
     ... 
    } 
    } 
} 

Se si sta creando un progetto C++ normale, non gestito, è necessario utilizzare l'interoperabilità COM per accedere all'assieme. Ciò implica rendere il tipo di demo nel tuo progetto C# COMVisible e registrarlo per l'interoperabilità COM. Dopo di che è possibile accedervi come qualsiasi altro componente COM.

+0

ho seguito questo http://support.microsoft.com/kb/828736 tutto va bene prima di "Chiama la DLL gestita da codice nativo C++" ma quando ho provato a creare un puntatore ottengo il seguente errore "errore C2259 : 'IISWebFrameworkDAAB :: DataAccessInterface': impossibile istanziare la classe astratta 1> a causa dei seguenti membri: 1> 'HRESULT IUnknown :: QueryInterface (const IID &, void **)': è astratto "Cosa devo fare? – user1402643

+0

In realtà il motivo dell'errore è "Motivo: impossibile convertire da 'const _GUID' a 'const IISWebFrameworkDAAB :: DataAccessInterface'" Cosa devo fare? – user1402643