2010-01-15 30 views
35

Estoy tratando de generar un proyecto C# dentro de una base de código CMake C++ existente en Windows. Después de algunas investigaciones, solo pude encontrar dos proyectos que construyeron sus propios compiladores CSharp para CMake: gdcm y kde.Generar proyecto C# utilizando CMake

Probé las dos. Lamentablemente, el primero no pudo generar un proyecto de C#. En cambio, creó un proyecto VS C++ con archivos cs, y debido a los indicadores C++ establecidos para el enlazador, la compilación siempre falló con errores. Después de experimentar con el proyecto de muestra que proporcionaron, me pregunto si esto podría deberse a una limitación del generador de código "Visual Studio 8 2005".

El segundo proyecto estaba dirigido principalmente a Mono, así que tampoco tuve éxito con él.

¿Alguien ha tenido una experiencia positiva con la construcción de proyectos de C# utilizando uno de esos módulos CMake u otra cosa?

Respuesta

1

Finalmente pude generar una solución válida utilizando el segundo módulo C# - kde. Aunque, cmake creó varios archivos .vcproj mientras esperaba obtener .csproj, pero supongo que es la única forma que el generador "Visual Studio 8 2005" puede ofrecer.

Sin embargo, pude construir con éxito esta solución y producir ejecutables y bibliotecas dll.

+0

Actualización: el hecho de que cmake haya creado proyectos de C++ con archivos de código fuente C# hace que el proyecto casi no se pueda utilizar: Intellisense no funciona, no se puede acceder a app.config por los medios habituales, etc. Estoy suspendiendo la investigación en esta dirección y cambiar a la configuración del proyecto basado en MsBuild. – Leonid

21

Por si acaso alguien todavía está buscando información sobre esto, realmente no hay ninguna razón para generar proyectos C# con CMake, sino que son de plataforma cruzada por diseño. En Linux, los proyectos de C# generalmente se administran con MonoDevelop, que puede leer archivos .csproj desde el estudio visual sin problemas. Esto debería permitir el desarrollo multiplataforma de proyectos C#. El único problema potencial sería si tuviera proyectos C++ nativos mezclados con proyectos de C# (como un backend escrito en C++ con una GUI en C#), en este caso simplemente haga copia de cmake sobre sus archivos .csproj como si fueran datos y usted debería ser bueno para ir. CMake está destinado a configurar su entorno de construcción para que sea multiplataforma. Esto es muy útil con C++, donde el código se construye de una manera muy diferente en Linux que en Windows (u otros sistemas operativos si se trata de eso), pero es algo innecesario para C# que puede ejecutar multiplataforma y, gracias al diseño decisiones del equipo mono, pueden construir plataforma cruzada. CMake proporciona algunas herramientas geniales para automatizar las cosas, pero gran parte de esta funcionalidad se puede recuperar con un archivo .csproj configurado correctamente. De todos modos, sé que esta pregunta tiene más de un año, pero es uno de los principales resultados de búsqueda con los que tropecé cuando buscaba cómo hacer esto. Desde entonces, me he dado cuenta de esto.

+3

Sí, pero mientras que cmake también proporciona funcionalidad de instalación, los proyectos planos de C# (csproj) no lo hacen.Me interesaría la funcionalidad "make && make install" para proyectos de C# si cmake pudiera proporcionarla. – fog

+0

No es difícil configurar un evento de compilación posterior para esto. Suponiendo que necesita integrarse en un sistema de compilación cmake existente, incluso puede usar el comando cmake configure_file para completar la ubicación de instalación correcta. –

+24

Hay una buena razón para generar proyectos C# por CMake. Si ha mezclado un proyecto nativo + C++/CLI + C# con mucha configuración realizada por CMake, necesita el proyecto C# para tener en cuenta la configuración realizada en CMake y referirse a los proyectos generados para C++ y estar incluidos en la solución correcta. –

1

Puede crear un proyecto con Visual Studio, de tomar lo diferencia y hacer CMake escribir usando configure_file comando (que tendrá que generar un poco de XML con la lista de fuentes) y añadirlo a la solución con include_external_msproject (para otros generadores, deberá crear el destino personalizado para ejecutar msbuild en él manualmente; cmake no parece ser compatible con hacerlo todavía). El proyecto es bastante simple, por lo que debería ser posible hacer eso.

24

CMake 2.8.9 y hasta agregar un parámetro TYPE-include_external_msproject así:

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

Esto le permite especificar que el proyecto es C# (la magia GUID arriba), de lo contrario las cosas luchan (see docs).

Probablemente aún desee utilizar el enfoque de plantilla configure_file mencionado en otra parte con su archivo .csproj para obtener las rutas correctas en él, a menos que vaya directamente a su árbol fuente.

La buena noticia es que se puede comodín sus archivos de C# en el archivo .csproj.template así:

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

y necesitará algo como esto en su CMakeLists.txt para convertir separadores de ruta forwardslash de estilo UNIX de CRealice en barras invertidas al estilo de windows, de lo contrario serán compilar los archivos pero no se mostrarán como enlaces en el proyecto en Visual Studio:

FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" DOS_STYLE_SOURCE_DIR) 

Entonces es sólo:

CONFIGURE_FILE(MyProject.csproj.template MyProject.csproj) 

En su CMakeLists.txt para configurar el archivo de plantilla en un archivo de proyecto real con la ruta de acceso de comodín derecha.

HTH.

+1

Podría dar un ejemplo completo (o un enlace a uno) de cómo: (1) Copiar la carpeta y los archivos de C# de origen; (2) el .csproj.template y cómo usarlo; y (3) ¿cómo actualizar CMakeLists.txt para hacer todo esto? –

+3

No necesita copiar la carpeta/archivos de origen de C#; se referencian en el lugar. El archivo csproj.template es el mismo que cualquier otro archivo csproj, a excepción del comodín indicado anteriormente. Solo copia uno. He agregado el comando actual CONFIGURE_FILE a mi respuesta, que era lo único que faltaba. –

+0

¿Necesito un CMakeLists.txt adicional en mi carpeta C# o todos estos cambios suceden en la raíz CMakeLists.txt? Si ocurren en la raíz CMakeLists.txt, ¿los pongo antes o después de la llamada a include_external_msproject()? –

16

A partir del CMake 3.8.2, la generación del proyecto CSharp es oficialmente compatible con CMake.

Para crear el proyecto predeterminado C#/WPF generado por Visual Studio 2017 con CMake, cree un archivo CMakeList.txt de la siguiente manera.

  • Declaración Proyecto

    project(Example VERSION 0.1.0 LANGUAGES CSharp) 
    
  • Incluir CMake CSharpUtilities si usted está planeando sobre el uso de WPF u otras propiedades de diseño.

    include(CSharpUtilities) 
    
  • Agrega todas las 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) 
    
  • archivos de enlace de diseño, xaml archivos y otros archivos de propiedades con su cs archivos

    correspondiente
    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) 
    
  • Conjunto aplicación App.xaml archivo de propiedades como punto de entrada del programa (si el proyecto es un proyecto WPF)

    set_property(SOURCE App.xaml PROPERTY VS_XAML_TYPE "ApplicationDefinition") 
    
  • otros indicadores establecidos csproj archivos

    set_property(TARGET Example PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1") 
    set_property(TARGET Example PROPERTY WIN32_EXECUTABLE TRUE) 
    ... 
    
  • Añadir bibliotecas

    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") 
    

Para una ejemplo de trabajo, vea https://github.com/bemehiser/cmake_csharp_wpf_example

Cuestiones relacionadas