2009-06-11 20 views
7

He creado un dll usando la línea de comando (csc). Supongamos que dll contiene el método Add (int, int). Ahora quiero usar esa función de agregar en vC++ ??Cómo usar C# Dll en vC++?

¿Cómo hacer esto?

Su ayuda será muy apreciada.

Esto es lo que estoy haciendo.

vcproj; para este proyecto tengo clic derecho y la sección del enlazador agrega dependencias adicionales. Agregué la ruta donde reside dll. No existe

main.cpp

using namespace Test 

void main() 

{ 

    demo d; 

    d.add(5,5); 

} 

espacio de nombres de error de prueba.

¿Cómo resolver esto?

tengo que usar esa DLL como en código no administrado

Respuesta

9

Su C# ensamblaje necesita el atributo ComVisible (entre algunas otras cosas).

[assembly: ComVisible(true)] 

Hay a guide to doing this here.

+2

Si se administra la aplicación C++, entonces es incluso más fácil que esto, por supuesto, y puede evitar COM por completo. – Noldorin

+0

@Matthew Brindley hice lo que se indica en http://support.microsoft.com/kb/828736 pero recibo un error de no se puede convertir de 'const _GUID' a 'const IISWebFrameworkDAAB :: DataAccessInterface' "¿Qué debo hacer? ? – user1402643

8

de los foros de MSDN Calling C# from unmanaged C++:

Lo que se quiere hacer sería compilar sólo los archivos en los que desea para cargar el código C#/CLR y luego llamar distancia usando C++/CLI. El resto de su aplicación seguirá siendo nativa, mientras que los archivos cpp que compile/clr se mezclarán nativo y CLR. Debería poder llamar al simplemente llame a su biblioteca C# usando la sintaxis C++/CLI de .

vez de tirar/CLR en la línea de comandos cl.exe para un archivo, dentro de ese archivo , puede llamar a cualquier código que desea administrado, independientemente de si estaba escrito en VB.net, C# o C++/CLI. Esta es, de lejos, la forma más fácil de hacer lo que quiere hacer (llame al código C# de su aplicación nativa C++), aunque tiene sus limitaciones y limitaciones . En general, "es Just Works". Además, es más rápido que p/invoca.

2

Esto depende en gran medida del tipo de aplicación C++ que esté creando. Si está compilando un ensamblado C++/CLI, entonces necesita asegurarse de que el proyecto tenga una referencia a la DLL C#. Una vez hecho esto, debería poder escribir el código como suposición escrita, tiene una definición de Demo como tal.

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

Si usted está construyendo un proyecto normal, no gestionados, C++, entonces debe utilizar interoperabilidad COM para acceder a la asamblea. Esto implica hacer el tipo de demostración en su proyecto C# COMVisible y registrarlo para la interoperabilidad COM. Después de lo cual puede acceder a él como cualquier otro componente COM.

+0

seguí esto http://support.microsoft.com/kb/828736 todo va bien antes de "Llamar a la DLL administrada del código nativo de C++", pero cuando intenté crear un puntero me sale el siguiente error "C2259 error" : 'IISWebFrameworkDAAB :: DataAccessInterface': no ​​puede instanciar la clase abstracta 1> debido a los siguientes miembros: 1> 'HRESULT IUnknown :: QueryInterface (const IID &, void **)': es abstracto "¿Qué debo hacer? – user1402643

+0

En realidad el motivo del error es "Motivo: no se puede convertir de 'const _GUID' a 'const IISWebFrameworkDAAB :: DataAccessInterface'" ¿Qué debo hacer? – user1402643

Cuestiones relacionadas