Tengo dos proyectos C# .NET 5, llamémoslos A y B. Ambos son ejecutables (no DLL). El proyecto A hace referencia al proyecto B. Me gustaría publicar el proyecto A como un ejecutable autónomo (aunque no en un solo archivo, si eso importa). Estoy usando este comando para iniciar el proceso de publicación:
dotnet publish A.csproj -c Release --self-contained -r win-x64 /p:PublishTrimmed=true /p:PublishReadyToRun=true
Sin embargo, esto produce el siguiente error al intentar compilar el proyecto B (que es obligatorio ya que el proyecto A hace referencia a él):
error NETSDK1031: It is not supported to build or publish a self-contained application without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set SelfContained to false.
Pero como puede ver, estoy (¿creo?) especificando un identificador de tiempo de ejecución con -r win-x64 . Supongo que el identificador de tiempo de ejecución que especifiqué en la línea de comandos no se pasa al compilar el proyecto B. ¿Cómo puedo solucionar esto sin deshabilitar SelfContained?
Mi versión de dotnet es:
dotnet --version 5.0.400 EDITAR: No quiero poner <RuntimeIdentifier>win-x64</RuntimeIdentifier> en mis archivos de proyecto porque necesito compilar para múltiples tiempos de ejecución diferentes y quiero poder controlar eso a través de la línea de comando.
Gracias a un par de comentarios en este problema de Github , pude descubrir cómo compilarlo:
Elimina la --self-contained de la línea de comandos. (Según los documentos , "El valor predeterminado es verdadero si se especifica un identificador de tiempo de ejecución y el proyecto es un proyecto ejecutable (no un proyecto de biblioteca)").
Agregue /p:ValidateExecutableReferencesMatchSelfContained=false a la línea de comandos. Esto era necesario para suprimir el error: "El proyecto al que se hace referencia 'B.csproj' es un ejecutable no autónomo. Un ejecutable no autónomo no puede ser referenciado por un ejecutable autónomo".
Si desea poder ejecutar el archivo B.exe que se generó al compilar el proyecto A, deberá agregar un archivo B.deps.json adecuado a la salida de la compilación. La forma más fácil que he encontrado para hacer esto es hacer una compilación independiente separada de B y luego simplemente copiar el archivo B.deps.json desde allí. (Y si está construyendo con PublishTrimmed como yo, es posible que deba agregar entradas en su archivo TrimmerRoots.xml para evitar que el código que necesita el proyecto B se recorte de la salida).
Después de hacer estas dos cosas, mi proyecto ahora se está construyendo y ejecutando con éxito. He verificado que todavía funciona incluso en una máquina que no tiene instalado .NET Runtime y, por lo tanto, la compilación realmente es autónoma como se desea.