2010-04-27 18 views

risposta

1

RE: Come chiamare codice gestito C# da un'applicazione non gestita C++?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

Calling gestito .NET C# oggetti COM non gestito dal codice C++ ...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

Wrapping un C# DLL gestita in C++ non gestito progetto: dll.

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

+0

Ho seguito il secondo collegamento che hai fornito e compilato con successo il file cpp ma non è riuscito a eseguirlo. Si sta venendo a mancare a CreateInstance() utilizzando smart pointer ..... così iam in grado di richiamare le funzioni di C# dll – user186246

+2

Si prega di postare qui una soluzione o almeno un riassunto di esso. Il collegamento può rompersi in futuro. E anche qui è più facile leggere tutte le soluzioni. Se sono più di uno puoi pubblicarli come risposte multiple. Grazie! ;) – bluish

8

Oppure utilizzare un project of mine che permette C# per creare le esportazioni non gestiti. Questi possono essere consumati come se fossero scritti in una lingua madre.

+0

Ciao, sembra molto interessante. Hai una versione per VS 2010, oppure puoi indicarmi quali modifiche apportare per renderlo disponibile per VS 2010/Net 4? Grazie – bzamfir

+0

Dovrebbe funzionare bene (lo uso io stesso nel 2010), potreste voler cambiare il framework di destinazione del progetto appena creato in 4.0, comunque. VS 2010 è impostato su .Net 2.0 quando non è presente alcuna impostazione del framework di destinazione. –

+0

Grazie, fantastico. L'ho visto (ho creato un progetto di prova campione vuoto, ma non testato se funziona ancora) – bzamfir

5

Ho usato prima l'interoperabilità COM, ma ora sono passato a IJW (funziona solo), in quanto è molto più semplice. Ho un wrapper C++/CLR DLL (compilare con/clr).

Un semplice esempio (usando statica per effettuare le chiamate più facili):

namespace MyClasses  
{ 
    public class MyClass 
    { 
     public static void DoSomething() 
     { 
      MessageBox.Show("Hello World"); 
     } 
    } 
} 

nella DLL posso fare riferimento namespace come segue:

using namespace MyClasses; 

e chiamarlo:

__declspec(dllexport) void CallManagedCode() 
{ 
    MyClass::DoSomething(); 
} 

Ora avete una DLL non gestita esportazione "CallManagedCode" che chiama in codice gestito.

Naturalmente, è anche necessario convertire i dati tra il limite gestito/non gestito. A partire da VS2008, Microsoft include un marshal-helper per la conversione tra tipi non gestiti e gestiti. Vedi http://msdn.microsoft.com/en-us/library/bb384865.aspx

+0

Non è necessario eseguire manualmente questa rotta. Controlla il link nella mia risposta. È del tutto possibile avere la controparte di DllImport in C#, inclusa tutta la qualità di marshalling che viene fornita con .Net. La mia attività MSBuild aggiunge le correzioni vt appropriate dopo la compilazione e non è necessario distribuire un altro assembly ... –

+0

L'ho provato: la DLL ha le esportazioni. Tuttavia, come dovrei usarlo? Non ho trovato un .lib per consentirmi di collegarmi alla DLL. –

+0

Non uso C++, ma suppongo che non sia diverso da come faresti per qualsiasi libreria che non viene fornita con intestazioni C/C++: Scrivi l'intestazione per le funzioni che desideri importare. Come ho detto, non uso il C++. È piuttosto semplice da C o Delphi. –

2

Ho utilizzato classi wrapper C++/CLI described here ed è stato relativamente facile da implementare.

+2

Si prega di postare qui una soluzione o almeno un riassunto di esso. Il collegamento può rompersi in futuro. E anche qui è più facile leggere tutte le soluzioni. Se sono più di uno puoi pubblicarli come risposte multiple. Grazie! ;) – bluish

Problemi correlati