2010-09-26 24 views
8

voglio usare dll fatto in C# (visual studio 2008) nel progetto C++ (visual studio 2003). come farlo ? prego heidelpusando C# dll nel progetto C++

+2

possibile duplicato di [Come utilizzare C# Dll in VC++ ??] (http://stackoverflow.com/questions/980808/how-to-use-c-dll-in-vc) –

+1

possibile duplicato di [E 'possibile utilizzare una DLL creata usando C# in un'applicazione VC++ non gestita?] (http://stackoverflow.com/questions/2873714/is-it-possibile-al-utile-a-dll-created-using- c-in-an-unmanaged-vc-application) –

+0

@ 0xA3: Sono curioso, come sarebbe VC++ 2008 rendere le cose più facili? Il codice compilato in VC 2003 può includere componenti COM e può includere qualsiasi tipo di DLL wrapper nativo, anche se è scritto in VC2008, giusto? – Niki

risposta

11
Ci

è più di una semplice interoperabilità COM, il MSDN FAQ elenca anche metodi meno conosciuti:

2.2 Come chiamare in .NET assembly da nativo Visual C++?

Esistono fondamentalmente quattro metodi per chiamare l'assembly .NET dal codice nativo VC++ . Microsoft All-In-One Code Framework ha esempi funzionanti che dimostrano i metodi . Modulo

  1. Native VC++ chiama CLR Hosting APIs per ospitare CLR, caricare e chiamata l'assembly .NET. (All-In-One codice del framework di codice di esempio: CppHostCLR)

  2. Se l'assembly .NET può essere esposta come un componente COM, modulo nativo VC++ può chiamare in assembly .NET attraverso NET - COM Interop. (codice Framework Code-in-One All campione : CppCOMClient)

  3. Reverse PInvoke: il gestito nativo codice di chiamata passando un delegato il codice nativo può richiamare. (All-In-One Codice quadro di esempio Codice: CSPInvokeDll)

  4. Se il modulo che contiene codice nativo VC++ è permesso di enable CLR, il VC nativo codice di ++ può chiamare assembly .NET direttamente attraverso i “E Just Works ", O" IJW ", meccanismo. (Codice Quadro Codice-in-one del campione: CppCLIWrapLib)

1

Non è possibile utilizzare direttamente gli assembly .NET dal codice C++ non gestito. Una possibile soluzione consiste nell'esporre l'assieme come oggetto COM utilizzando l'utilità regasm.exe e quindi utilizzarlo da C++. Si noti che i tipi .NET che devono essere esposti come oggetti COM potrebbero dover essere decorati con l'attributo [COMVisible(true)] e richiederebbero comunque il framework .NET installato sul computer di destinazione che esegue il codice C++.

1

Ci sono molti modi per farlo.

La DLL C# è una DLL COM? In tal caso, è possibile utilizzare la regolare API/specifica COM per accedervi nel programma C++. Ci sono molti tutorial su come rendere visibile la COM DLL C#. Non è così difficile, poche opzioni di compilazione e attributi C# in pratica.

Altrimenti, è possibile compilare il progetto C++ utilizzando lo switch del compilatore /clr? In tal caso, è possibile utilizzare Using Directive per importare direttamente la DLL C#.

0

Crea file di libreria [.Tlb] e quindi solo noi possiamo usare le dll. Devi creare .TLB (Type Library file) della tua DLL C# originale e usare quella libreria .TLB nel codice VC++. Per questo è necessario registrare il file .TLB sul proprio PC ed è necessario importare il file .TLB nella propria applicazione vC++. Quando scrivete C# DLL ricordate di usare le interfacce che sarebbero state implementate nella classe.

1

Come ha detto Darin, un modo è tramite COM. Gli altri due modi (lo so) sono:

  • È possibile creare una DLL in modalità mista in C++. Quella DLL può contenere e chiamare il codice gestito, ma può anche esportare funzioni non gestite, come una normale DLL C++. Può essere incluso come qualsiasi altra DLL C++
  • È molto più difficile, ma puoi anche ospitare il CLR. Google per "hosting CLR" per trovare dettagli sull'API o sui campioni.
1

dopo aver impostato il "resolve #using References" (Progetto-> C/C++ -> Generale) opzione del compilatore nella directory che contiene l'assemblea vuoi, poi metti una riga come questa nel tuo codice.

#using <NiftyAssembly.dll>