AnyCPU/x86/x64 per applicazione C# e C++/CLI dipendenza

Sto per sviluppatori di Windows, sto utilizzando Microsoft visual studio 2008 SP1. Mio sviluppatore macchina è a 64 bit.

Il software attualmente sto lavorando è riuscito .exe scritto in C#. Purtroppo non sono stato in grado di risolvere l’intero problema solo in C#. Ecco perché ho sviluppato un piccolo gestiti DLL in C++/CLI. Entrambi i progetti sono nella stessa soluzione.

Mio C# .exe costruire obiettivo è “CPU”. Quando il mio DLL in C++ build target è “x86”, la DLL non viene caricato.
Per quanto ho capito quando ho cercato su google, il motivo è C++/CLI lingua, a differenza di altri .NET lingue, compila in codice nativo, non di codice gestito.

Ho acceso la DLL in C++ build target per x64 e funziona tutto ora. Tuttavia, per quanto ne sappia tutto smette di funzionare non appena il mio client si installa il prodotto su una versione a 32-bit OS. Io sono per il supporto di Windows Vista e 7, sia a 32 e 64 bit di ciascuno di essi.

Non voglio cadere di nuovo a 32 bit. Che 250 righe di codice C++ nella mia DLL è solo il 2% del mio codebase. E la DLL viene utilizzato solo in luoghi diversi, così nel tipico scenario di utilizzo non è ancora stato caricato.

Mio DLL implementa due oggetti COM con ATL, quindi non si possono usare “/clr:cassetta di sicurezza” impostazione del progetto.

C’è modo di configurare la soluzione e i progetti, in modo che il progetto C# costruisce “CPU” versione, il progetto di C++ build sia 32 bit che a 64 bit, quindi in fase di esecuzione quando l’gestito .EXE di avvio, si utilizza DLL a 32 bit o a 64-bit DLL a seconda del sistema operativo?

O forse c’è qualche soluzione migliore, io non sono a conoscenza?

Grazie in anticipo!

  • C’è un motivo, non è possibile distribuire in due versioni, una per x86 e una per x64?
  • Sei sicuro di compilazione del C++ per CLI?
InformationsquelleAutor Soonts | 2010-06-03

 

2 Replies
  1. 7

    Non c’è modo intorno ad esso. Se si dispone di codice nativo (cioè il C++) e avete bisogno di supporto x86, quindi devi compilare x86 (a meno che non si desidera lavorare in WOW mondo…ie. l’esecuzione di codice a 32 bit, sia a 32 sia a 64 bit envrionments). Si può sia x86 e x64 distribuzioni, ma se stai sostenendo sia a 32 e 64 bit, e si dispone di codice nativo o COM introp’ poi si devono hanno entrambe le versioni a 32 e 64 bit binari. “CPU” solo è molto utile quando non c’è il codice nativo o di interoperabilità, che beneficiare.

    • Sì, e il 98% del mio codice è scritto in C#, e viene gestito. Mi piacerebbe mantenere solo 1 pacchetto di installazione, supporto e l’unica versione del mio software. Penso di andare avanti con la “CPU”, e di indagare su come caricare le 2 Dll in modo dinamico, in codice C#.. Grazie comunque!
    • se si crea il pacchetto di installazione correttamente, è possibile selezionare e installare i file binari corretti. Ecco cosa faccio quando il server, applicazioni e idiota amministratori si scontrano 🙂
  2. 10

    C’è un modo: per avere un “AnyCPU” C# wrapper e un progetto C++ per l’architettura, e lasciare che il C# wrapper caricare il diritto di progetto C++ in fase di esecuzione.

    Per il progetto di C++, creare una versione per i diversi architettura (x86, x64), e costruire tutti loro. Poi nel wrapper fare:

    public class CppWrapper
    {
        //C++ calls that will be dynamically loaded from proper architecture:
        public static readonly Func<long> MyCplusplusMethodUsableFromCsharpSpace;
    
        //Initialization:
        static CppWrapper()
        {
            if(Environment.Is64BitProcess)
            {
                MyCplusplusMethodUsableFromCsharpSpace = CppReferences64.MyCplusplusClass.Method;
                //Add your 64-bits entry points here...
            }
            else
            {
                MyCplusplusMethodUsableFromCsharpSpace = CppReferences32.MyCplusplusClass.Method;
                /* Initialize new 32-bits references here... */
            }
        }
    
        //Following classes trigger dynamic loading of the referenced C++ code
        private static class CppReferences64
        {
            public static readonly Func<long> MyCplusplusMethod = Cpp64.MyCplusplusMethod;
            /* Add any64-bits references here... */
        }
        private static class CppReferences32
        {
            public static readonly Func<long> MyCplusplusMethod = Cpp32.MyCplusplusMethod;
            /* Add any 32-bits references here... */
        }
    }

    E il codice C++, io uso le stesse fonti, come ho detto, ma la compilazione dei nomi diversi, a seconda del costruire architettura:

    #ifdef _M_X64
    namespace Cpp64 {
    #else
    namespace Cpp32 {
    #endif
        public ref class MyCPlusPlusClass
        {
            public: static __int64 Method(void) { return 123; }
        };
    }
    • C# classe non è in grado di costruire, come il C++ gestito DLL contengono solo Cpp64 o Cpp32 ma non entrambi.

Lascia un commento