Tengo dificultades para averiguar si y cómo puedo usar Visual Studio Code para desarrollar y depurar la línea de comandos/consola/bibliotecas de programas C#.Net que no pueden ejecutarse en .Net Core , es decir, requieren .Net Framework . Necesito acceder a Oracle, que no tiene un proveedor de .Net Core, pero sí tiene un proveedor de .Net Framework administrado. Utilizo VS 2015/2017 para esta tarea, pero me gustaría cambiar a VS Code si pudiera codificar, compilar y depurar programas C# de destino de .Net Framework. He intentado buscar en Google y no he podido encontrar nada.
Desafortunadamente, no cuenta con intellisense para C/C++, solo resaltado de sintaxis: code.visualstudio.com/docs/languages EDITAR: tampoco hay integración de depurador para C/C++. ¡Sin embargo, la integración de git es realmente agradable! Parece más diseñado para aplicaciones web, el depurador funciona para node.js
Si bien esto no especifica C#, es lógico que se apliquen los mismos estándares (es decir, que no hay depurador ni funcionalidad de compilación).
Cita tomada del comentario sobre la primera respuesta de ¿Qué es exactamente Visual Studio Code?
https://code.visualstudio.com/docs/languages/csharp
Cita:
Nota: VS Code no admite la depuración de aplicaciones que se ejecutan en Desktop .NET Framework .
Parece que el IDE completo de Visual Studio sigue siendo un requisito para .Net Framework. Lástima mayor.
Acabo de crear una aplicación de consola simple y personalicé el archivo csproj. Luego, pude adjuntar el depurador OmniSharp a una aplicación completa de .NET Framework. El archivo csproj se ve así:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net47</TargetFramework> <PlatformTarget>x64</PlatformTarget> <DebugType>portable</DebugType> </PropertyGroup> </Project>
Acabo de seguir la documentación oficial : cambié TargetFramework
para que se ejecute en .NET 4.7, PlatformTarget
a 64 bits y DebugType
a portátil.
Además, actualicé launch.json:
{ // Use IntelliSense to find out which attributes exist for C# debugging // Use hover for the description of the existing attributes // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md "version": "0.2.0", "configurations": [ { "name": ".NET Launch (console)", "type": "clr", "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. "program": "${workspaceFolder}/bin/Debug/net47/FullNetInVsCode.exe", "args": [], "cwd": "${workspaceFolder}", // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window "console": "internalConsole", "stopAtEntry": false, "internalConsoleOptions": "openOnSessionStart" }, { "name": ".NET Attach", "type": "clr", "request": "attach", "processId": "${command:pickProcess}" } ,] }
En este archivo, simplemente cambié el type
a clr
en ambos objetos JSON y el program
dirigido al archivo exe.
Luego, podría establecer un punto de interrupción y simplemente presionar F5 para comenzar a depurar en .NET Framework completo:
En primer lugar, las actualizaciones más recientes de Visual Studio Code admiten proyectos de compilación y depuración para .NET Framework, pero es muy limitado.
La página de GitHub para OmniSharp (responsable de la extensión de C#) dice que:
La extensión de C# admite la depuración completa limitada de .NET Framework. Solo puede depurar aplicaciones de 64 bits con PDB portátiles .
Pero, incluso después de leer muchos temas y discusiones sobre este tema, me quedó un poco confuso cuáles eran los pasos necesarios, así que expondré aquí una pequeña guía con los pasos que he seguido y que me funcionaron, y ojalá , también funcionará para usted.
Los archivos/carpetas necesarios son:
un. .vscode
con launch.json
y tasks.json
.
B. carpeta bin\Debug
para su aplicación .exe y los ensamblajes a los que podría querer crear una referencia.
D. los archivos <project>.csproj
y Program.cs
.
mi. opcionalmente un archivo por lotes, cuyo propósito describiré más adelante.
Instale MSBuild 15 (2017) .
En el archivo <project>.csproj
:
cambie Project Sdk="Microsoft.NET.Sdk"
a Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
.
en el primer PropertyGroup
, debemos establecer OutputType
en Exe
(el valor predeterminado puede ser dll
), eliminar la propiedad TargetFramework
y reemplazarla con TargetFrameworkVersion
con el valor v4.6.1
(ejemplo para .NET Framwork 4.6.1, puede ser 4.7, por ejemplo), y por ultimo poner los runtimes win-x64 y win7-x64 (y cualquier otro que el compilador se pueda quejar). Este primer PropertyGroup
debería verse así:
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <RuntimeIdentifiers>win-x64;win7-x64</RuntimeIdentifiers> </PropertyGroup>
establezca otro PropertyGroup` con los siguientes elementos:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PlatformTarget>x64</PlatformTarget> <DebugSymbols>true</DebugSymbols> <DebugType>portable</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup>
Algunos comentarios: la condición utilizada indica que estas propiedades solo se aplican cuando la configuración que se pasa al compilador es Depurar y la Plataforma es "Cualquier CPU", es posible que desee insertar otras condiciones con valores diferentes, o incluso no usar ninguna condición. ; los valores más importantes aquí son: La propiedad PlatformTarget debe ser x64 y DebugType debe ser portátil ; la ruta de salida se establece en bin\Debug.
Como no estamos usando el SDK de Microsoft debemos incluir el Program.cs
, para que el compilador lo encuentre:
<ItemGroup> <Compile Include="Program.cs" /> </ItemGroup>
crea las referencias necesarias a tu proyecto, por ejemplo:
<ItemGroup> <Reference Include="mscorlib" /> <Reference Include="System.Core" /> <Reference Include="System.Windows" /> <Reference Include="System.ServiceModel" /> <Reference Include="System.Net" /> <Reference Include="System.Xml" /> <Reference Include="System" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.Net.Http" /> </ItemGroup>
finalmente importe las siguientes herramientas (asegúrese de seguir el orden expuesto aquí, colocando esto al principio por ejemplo genera un error)
Todo debería verse así:
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <RuntimeIdentifiers>win-x64;win7-x64</RuntimeIdentifiers> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PlatformTarget>x64</PlatformTarget> <DebugSymbols>true</DebugSymbols> <DebugType>portable</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PlatformTarget>x64</PlatformTarget> <DebugType>portable</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> <Compile Include="Program.cs" /> </ItemGroup> <ItemGroup> <Reference Include="mscorlib" /> <Reference Include="System.Core" /> <Reference Include="System.Windows" /> <Reference Include="System.ServiceModel" /> <Reference Include="System.Net" /> <Reference Include="System.Xml" /> <Reference Include="System" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.Net.Http" /> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </Project>
En el launch.json
:
Cree una nueva configuración (por ejemplo, MyLauncher
), cuyo tipo debe ser clr , y que apunte a su programa; la preLaunchTask
se establecerá en una configurada manualmente ( "mybuild"
, por ejemplo) que se especificará en tasks.json
; un ejemplo de la configuración es:
{ "version": "0.2.0", "configurations": [ { "name": "MyLauncher", "type":"clr", "request": "launch", "preLaunchTask": "mybuild", "program": "${workspaceFolder}/bin/Debug/<project>.exe", "args":[], "console": "internalConsole", "stopAtEntry": false, "internalConsoleOptions": "openOnSessionStart" }, { other configurations... } ,] }
En las tasks.json
:
Cree una tarea "mybuild"
con los comandos para construir su proyecto.
Usaremos MSBuild 15 aquí (no use la compilación dotnet, al menos no funcionó para mí).
Puede apuntar directamente al (path)\MSBuild.exe
(o msbuild.exe
, si está en el %PATH%
) con los argumentos para compilar el proyecto. A continuación se muestra un ejemplo, tenga en cuenta que configuré la Configuración en Depurar y la plataforma en AnyCPU, coincidiendo con la condición que configuré en el archivo .csproj
, también tenga en cuenta que las barras invertidas en \"AnyCPU\"
se deben al uso de las comillas.
{ "version": "2.0.0", "tasks": [ { "label": "mybuild", "command":"<path to msbuild>\MSBuild.exe", "type":"shell", "args":[ "<project>.csproj", "/t:Build", "/p:Configuration=Debug", "/p:Platform=\"AnyCPU\"" ] } ] }
pero hay otra forma, usando el archivo .bat
; en mi caso, la ruta a MSBuild.exe
tenía espacios y eso generaba un error cuando se ejecutaba la tarea, por lo que puse el siguiente código en un archivo .bat
(guarde el bloc de notas como name.bat
):
"(path)\MSBuild.exe" (project).csproj /t:Build /p:Configuration=Debug /p:Platform="AnyCPU"
y luego establezca la tarea "mybuild"
en:
{ "label": "mybuild", "command":"build.bat", "type":"shell", "args":[] }
Donde build.bat
es el archivo por lotes que he creado con el código anterior.
Después de esto, es posible que deba guardar, cerrar y volver a abrir los archivos (esto muchas veces me soluciona los problemas).
Establezca su configuración en el depurador en MyLauncher
:
Ejecute su código con el botón verde de reproducción; llamará a MyLauncher
, que primero compilará su proyecto con MSBuild 15 y luego ejecutará el archivo exe
Así que eso fue todo.
Aquí hay algunas referencias:
Para empezar, instale Build Tools para Visual Studio 2019
A su espacio de trabajo de VS Code, agregue la carpeta .vscode y task.json para compilar su proyecto. Use a continuación una muestra de tasks.json que se puede usar principalmente para cualquier proyecto de .Net Framework.
{ "version": "2.0.0", "command": "msbuild", "args": [ "/property:GenerateFullPaths=true" ], "tasks": [{ "label": "build", "problemMatcher": "$msCompile" }] }
Siguiente paso para hacer que F5 funcione con VS Code. Para que funcione, agregue launch.json en la carpeta .vscode
{ "version": "0.2.0", "configurations": [ { "name": ".NET Framework Launch", "type": "clr", "request": "launch", "preLaunchTask": "build", "program": "demo.console.exe", "args": [], "cwd": "${workspaceFolder}\\demo.console\\bin\\debug\\net461\\", "stopAtEntry": false }, { "name": ".NET Framework", "type": "clr", "request": "attach", "processId": "${command:pickProcess}" } ] }
Nota: cambie "programa" y "cwd" para su aplicación