2010-05-17 16 views
8

Nel mondo non gestito, sono stato in grado di scrivere un __declspec (dllexport) o, in alternativa, utilizzare un file .DEF per esporre una funzione per poter chiamare una DLL. (A causa del nome mangling in C++ per __stdcall, ho inserito alias nel file .DEF in modo che alcune applicazioni potessero riutilizzare determinate funzioni DLL esportate.) Ora, mi interessa poter esporre una singola funzione entry-point da un Assemblaggio .NET, in modo non gestito, ma è necessario che entri in funzioni in stile .NET all'interno della DLL. È possibile, in modo semplice e diretto?Come si chiamano le DLL C++/CLI (.NET) da applicazioni non-.NET standard non gestite?

Quello che ho è un programma di terze parti che ho esteso tramite DLL (plugin) che implementano una matematica complessa. Tuttavia, il programma di terze parti non ha alcun mezzo per visualizzare i calcoli. Voglio in qualche modo prendere queste funzioni matematiche pre-scritte, compilarle in una DLL separata (ma usando C++/CLI in .NET), ma poi aggiungere ganci alle funzioni in modo da poter rendere visibile ciò che sta succedendo in un .NET. controllo dell'utente. Non sono sicuro di come fondere le cose .NET con le cose non gestite, o cosa fare per Google per svolgere questa attività.

Suggerimenti specifici relativi al ponte gestito/non gestito o metodi alternativi per eseguire il rendering nel modo descritto sono utili. Grazie.

risposta

4

Usi C++/CLI perché vuoi, o perché pensi di dover esportare le funzioni?

In quest'ultimo caso, controllare il numero unmanaged exports, che consente di dichiarare esportazioni non gestite in C# equivalenti a come funziona DllImport.

internal class Sample 
{ 
    [DllExport("_export_test", CallingConvention.Cdecl)] 
    static int Test(int a) 
    { 
    return a + 1; 
    } 
} 
+0

ho voluto usare C++/CLI perché la libreria di terze parti sarebbe compilare automaticamente da solo utilizzando l'opzione/CLR. Quindi aggiungere legami al framework .NET renderebbe la vita molto migliore (credo) Il tuo esempio sembra un approccio ragionevole. Grazie. – user343400

+0

Non sono sicuro di seguirti qui. Quando si prende il mio modello di progetto, verrà compilato automaticamente (creerà anche un file .lib). Tranne se ti ho frainteso, e in realtà vuoi usare C++/CLI. –

4

Bene, il compilatore C++/CLI lo rende piuttosto facile. Basta scrivere una funzione gestita statica e attribuirla con __declspec (dllexport). Il compilatore inietta uno stub che carica automaticamente il CLR per eseguire il codice gestito.

Questo è un approccio utile, non è molto estensibile e non sarà molto veloce. Il passo successivo è che scrivi una classe ref con l'attributo [ComVisible (true)]. Dopo averlo registrato con Regasm.exe, qualsiasi client non gestito COM consapevole può utilizzare quel server. L'hosting del CLR (CorBindToRuntimeEx) di solito è l'ultima opzione, ma la più universale.


codice Esempio:

ref class ManagedClass { 
public: 
    static void StaticFunc() {} 
}; 

extern "C" __declspec(dllexport) 
void __stdcall UnmanagedFunc() { 
    ManagedClass::StaticFunc(); 
} 
+0

Se ho bisogno di __stdcall sul nome e voglio eliminare @number sul nome mangling e ho bisogno di creare un alias in un file .DEF, come faccio a farlo in questo caso? Quello che mi serve è una firma di stile "C" extern in modo che possa essere chiamata da un tipo specifico di applicazione di terze parti. – user343400

+0

Basta usare extern "C" e i dichiaratori __stdcall nell'esportazione. Non hai bisogno di un file .def. Campione pubblicato. –

+0

@HansPassant Che cosa intendi per "il compilatore inietta uno stub"? Il compilatore genera un .lib (e il chiamante di UnmanagedFunc() dovrebbe collegarsi alla lib)? – qqqqq

Problemi correlati