2010-01-15 23 views
35

Sto provando a generare un progetto C# all'interno di una base di codice CMake C++ esistente su Windows. Dopo alcune ricerche, ho potuto trovare solo due progetti che hanno creato i propri compilatori CSharp per CMake: gdcm e kde.Genera progetto C# utilizzando CMake

Ho provato entrambi. Sfortunatamente, il primo non è riuscito a generare un progetto C#. Invece ha creato un progetto VS C++ con i file cs al suo interno, e a causa dei flag C++ impostati per il linker, la build ha sempre fallito con errori. Dopo aver sperimentato con il progetto di esempio fornito, mi chiedo se questo potrebbe essere dovuto a una limitazione del generatore di codice "Visual Studio 8 2005"?

Il secondo progetto era principalmente rivolto a Mono, quindi non ci sono riuscito.

Qualcuno ha avuto un'esperienza positiva con la creazione di progetti C# utilizzando uno di questi moduli CMake o qualcos'altro?

risposta

1

Sono finalmente riuscito a generare una soluzione valida utilizzando il secondo modulo C# - kde. Sebbene, cmake abbia creato un certo numero di file .vcproj mentre mi aspettavo di ottenere .csproj, ma suppongo che sia l'unico modulo che il generatore di "Visual Studio 8 2005" può offrire.

Tuttavia, sono riuscito a creare questa soluzione e produrre librerie eseguibili e DLL.

+0

Aggiornamento: il fatto che cmake abbia creato progetti C++ con file di codice C# in essi rende il progetto quasi inutilizzabile - Intellisense non funziona, non è possibile accedere a app.config con i mezzi regolari, ecc. Sto interrompendo ulteriori indagini in questa direzione e passando alla configurazione del progetto basato su MsBuild. – Leonid

21

Nel caso in cui qualcuno stia ancora cercando informazioni su questo, non c'è davvero alcun motivo per generare progetti C# con CMake, sono multipiattaforma per progettazione. Su Linux, i progetti C# sono generalmente gestiti con MonoDevelop che può leggere file .csproj da Visual Studio. Ciò dovrebbe consentire lo sviluppo multipiattaforma di progetti C#. L'unico potenziale problema sarebbe se avessi progetti C++ nativi mescolati con progetti C# (come un backend scritto in C++ con una GUI in C#), in questo caso basta copiare cmake sui tuoi file .csproj come se fossero dati e tu dovrebbe essere buono per andare CMake è progettato per configurare l'ambiente di generazione in modo che sia multipiattaforma. Questo è veramente utile con C++, dove il codice è costruito in modo molto diverso su Linux che su Windows (o altri SO se ci sei), ma è un po 'inutile per C# che può essere eseguito su più piattaforme, e, grazie al design le decisioni prese dal team mono, possono costruire cross platform. CMake fornisce alcuni ottimi strumenti per automatizzare le cose, ma molte di queste funzionalità possono essere ripristinate con un file .csproj correttamente configurato. Comunque, so che questa domanda ha più di un anno, ma è uno dei risultati di ricerca migliori in cui sono incappato quando stavo cercando come farlo. Da allora ho realizzato questa realizzazione.

+3

Sì, ma anche se cmake fornisce anche funzionalità di installazione, i progetti C# semplici (csproj) no.Sarei interessato alla funzionalità "make && make install" per i progetti C# se cmake potrebbe fornirli. – fog

+0

Non è difficile impostare un evento post-build per questo. Supponendo che sia necessario integrarsi in un sistema di generazione cmake esistente, è anche possibile utilizzare il comando cmake configure_file per compilare il percorso di installazione corretto. –

+24

C'è una buona ragione per generare progetti C# da parte di CMake. Se si ha un progetto misto nativo + C++/CLI + C# con molta configurazione eseguita da CMake, è necessario il progetto C# per prendere in considerazione la configurazione eseguita in CMake e fare riferimento ai progetti generati per C++ ed essere inclusi nella soluzione corretta. –

1

È possibile creare un progetto con Visual Studio, piuttosto che smontarlo e rendere CMake scrivendolo tramite il comando configure_file (sarà necessario generare un po 'di XML con l'elenco di fonti) e aggiungerlo alla soluzione con include_external_msproject (per gli altri generatori dovrai creare il target personalizzato per eseguire msbuild su di esso manualmente, ma sembra che cmake non lo supporti ancora). Il progetto è piuttosto semplice, quindi dovrebbe essere possibile farlo.

24

CMake 2.8.9 e fino aggiungere un parametro TYPE-include_external_msproject in questo modo:

include_external_msproject(
    MyProject MyProject.csproj 
    TYPE FAE04EC0-301F-11D3-BF4B-00C04F79EFBC) 

Questo consente di specificare che il progetto è C# (la magia GUID sopra), altrimenti le cose lottano (see docs).

Probabilmente vorrete ancora usare l'approccio modello configure_file menzionato altrove con il vostro file .csproj per ottenere i percorsi giusti, a meno che non stiate costruendo direttamente nell'albero dei sorgenti.

La buona notizia è che è possibile jolly i file C# nel file .csproj.template in questo modo:

<ItemGroup> 
    <Compile Include="${DOS_STYLE_SOURCE_DIR}\**\*.cs" /> 
</ItemGroup> 

E avrete bisogno di qualcosa come questo nel tuo CMakeLists.txt per convertire in stile UNIX separatori di percorso forwardslash di CMake in backslash stile Windows, altrimenti compilare i file, ma non verranno visualizzati come collegamenti nel progetto in Visual Studio:

FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR) 

Poi è solo:

CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj) 

Nel tuo CMakeLists.txt per configurare il file modello in un file di progetto reale con il percorso jolly corretto.

HTH.

+1

Puoi dare un esempio completo (o un link a uno) su come: (1) copiare la cartella C# sorgente ei file; (2) il .csproj.template e come usarlo; e (3) come aggiornare CMakeLists.txt per fare tutto questo? –

+3

Non è necessario copiare la cartella/i file sorgente C# - sono referenziati sul posto. Il file csproj.template è uguale a qualsiasi altro file csproj, ad eccezione del carattere jolly annotato sopra. Basta copiare uno. Ho aggiunto il comando CONFIGURE_FILE alla mia risposta, che era l'unica cosa che mancava. –

+0

Ho bisogno di un extra CMakeLists.txt nella mia cartella C# o tutte queste modifiche si verificano nella radice CMakeLists.txt? Se si verificano nella radice CMakeLists.txt, li inserisco prima o dopo la chiamata a include_external_msproject()? –

16

A partire da CMake 3.8.2, la generazione di progetti CSharp è ufficialmente supportata da CMake.

Per creare il progetto C#/WPF predefinito di Visual Studio 2017 utilizzando CMake, creare un file CMakeList.txt nel modo seguente.

  • Dichiarazione Progetto

    project(Example VERSION 0.1.0 LANGUAGES CSharp) 
    
  • Includere CMake CSharpUtilities se si sta pensando di usare le proprietà di design WPF o.

    include(CSharpUtilities) 
    
  • aggiungere tutti cs, xaml, settings, properties

    add_executable(Example 
        App.config 
        App.xaml 
        App.xaml.cs 
        MainWindow.xaml 
        MainWindow.xaml.cs 
    
        Properties/AssemblyInfo.cs 
        Properties/Resources.Designer.cs 
        Properties/Resources.resx 
        Properties/Settings.Designer.cs 
        Properties/Settings.settings) 
    
  • file di collegamento di design, xaml file e altri file di proprietà con il loro corrispondente cs file

    csharp_set_designer_cs_properties(
        Properties/AssemblyInfo.cs 
        Properties/Resources.Designer.cs 
        Properties/Resources.resx 
        Properties/Settings.Designer.cs 
        Properties/Settings.settings) 
    
    csharp_set_xaml_cs_properties(
        App.xaml 
        App.xaml.cs 
        MainWindow.xaml 
        MainWindow.xaml.cs) 
    
  • Set app 0 il fileproprietà come punto di ingresso del programma (se il progetto è un progetto WPF)

    set_property(SOURCE App.xaml PROPERTY VS_XAML_TYPE "ApplicationDefinition") 
    
  • Impostare le altre bandiere csproj di file

    set_property(TARGET Example PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1") 
    set_property(TARGET Example PROPERTY WIN32_EXECUTABLE TRUE) 
    ... 
    
  • aggiungere librerie

    set_property(TARGET Example PROPERTY VS_DOTNET_REFERENCES 
        "Microsoft.CSharp" 
        "PresentationCore" 
        "PresentationFramework" 
        "System" 
        "System.Core" 
        "System.Data" 
        "System.Data.DataSetExtensions" 
        "System.Net.Http" 
        "System.Xaml" 
        "System.Xml" 
        "System.Xml.Linq" 
        "WindowsBase") 
    

Per un esempio di lavoro, vedi https://github.com/bemehiser/cmake_csharp_wpf_example

Problemi correlati