用于.NET框架的Visual Studio代码

qeeaahzv  于 2023-03-04  发布在  .NET
关注(0)|答案(5)|浏览(160)

我很难弄清楚是否以及如何使用Visual StudioCode开发和调试无法在.NET Core上运行的C# .NET程序的命令行/控制台/库,即,它们需要.NET Framework**。我需要访问Oracle,它没有.NET核心提供程序,但有托管.NET Framework提供程序。我使用VS 2015/2017年为这项任务,但想切换到VS代码,如果我可以编码,构建和调试.NET框架目标C#程序。我已经尝试了谷歌搜索,找不到任何东西。

mcdcgff0

mcdcgff01#

首先,Visual Studio Code的最新更新确实支持为. NET Framework构建和调试项目,但非常有限。
GitHub page for OmniSharp(负责C#扩展)表示:
C#扩展支持有限的完整. NET Framework调试。它只能调试使用portable PDBs的64位应用程序。
但是,即使在阅读了许多关于这个主题的问题和讨论之后,我仍然有点不清楚必要的步骤是什么,所以我将在这里展示一个小指南,其中包括我所遵循的步骤,这些步骤对我有效,希望对你也有效。
1.必要的文件/文件夹包括:
a.将.vscodelaunch.jsontasks.json结合。
b. bin\Debug文件夹,其中包含. exe应用程序和可能要创建引用的程序集。
d. <project>.csprojProgram.cs文件。
即,可选地,批处理文件,其目的将在后面描述。
1.安装MSBuild 15 (2017)

  • <project>.csproj文件中:
  • Project Sdk="Microsoft.NET.Sdk"更改为Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  • 在第一个PropertyGroup中,我们必须将OutputType设置为Exe(默认值可能为dll),删除TargetFramework属性,替换为值为v4.6.1TargetFrameworkVersion(例如,对于. NET框架4.6.1,它可以是4.7),最后放入运行时win-x64和win7-x64(以及编译器可能会抱怨的任何其他运行时)。
<PropertyGroup>
   <OutputType>Exe</OutputType>
   <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
   <RuntimeIdentifiers>win-x64;win7-x64</RuntimeIdentifiers>
</PropertyGroup>
  • 使用以下项目设置另一个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>

一些评论:使用的条件表明这些属性仅在传递给编译器的配置为Debug且Platform为"AnyCPU"时适用,您可能希望插入具有不同值的其他条件,甚至根本不使用条件;这里最重要的值是:* * PlatformTarget属性必须是x64,并且调试类型必须是可移植的;输出路径设置为bin\Debug。

  • 由于我们没有使用Microsoft SDK,因此必须包含Program.cs,以便编译器能够找到它:
<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>
  • 最后,导入以下工具(确保您遵循此处显示的顺序,将其放在开头,以防生成错误)

整个事情应该看起来像这样:

<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>
  • launch.json
  • 创建一个新的配置(例如MyLauncher),其类型必须为clr,并且指向您的程序;将preLaunchTask设置为手动配置的(例如"mybuild"),手动配置的preLaunchTask将在tasks.json中指定;配置的一个例子是:
{
   "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...
        }
    ,]
}
  • tasks.json
  • 使用生成项目的命令创建任务"mybuild"
  • 我们将在这里使用MSBuild 15(不要使用dotnet构建-至少它对我不起作用)。
  • 您可以直接指向(path)\MSBuild.exe(或者msbuild.exe,如果它在%PATH%中的话)文件中的参数来构建项目。下面显示了一个例子,注意我已经将Configuration设置为Debug,将platform设置为AnyCPU,这与我在.csproj文件中设置的条件相匹配。还要注意,\"AnyCPU\"中的反斜线是因为使用了引号。
{
    "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\""
            ]
        }
    ]
}
  • 但是还有另一种方法,使用.bat文件;在我的例子中,MSBuild.exe的路径有空格,这会在任务运行时生成错误,因此我将以下代码放入.bat文件中(将记事本保存为name.bat):
"(path)\MSBuild.exe" (project).csproj /t:Build /p:Configuration=Debug /p:Platform="AnyCPU"

然后将"mybuild"任务设置为:

{
    "label": "mybuild",
    "command":"build.bat",
    "type":"shell",
    "args":[]
}

其中build.bat是我用前面的代码创建的批处理文件。

  • 在此之后,您可能必须保存、关闭和重新打开文件(这多次为我修复了问题)。
  • 将调试器中的配置设置为MyLauncher

  • 使用绿色的播放按钮运行您的代码;它将调用MyLauncherMyLauncher将首先使用MSBuild 15生成项目,然后运行exe文件

原来是这样。
以下是一些参考资料:

x9ybnkn6

x9ybnkn62#

我刚刚创建了一个简单的控制台应用程序并定制了csproj文件,然后,我可以将OmniSharp调试器附加到一个完整的.NET框架应用程序,csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net47</TargetFramework>
    <PlatformTarget>x64</PlatformTarget>
    <DebugType>portable</DebugType>
  </PropertyGroup>

</Project>

我只是按照official documentation:我将TargetFramework更改为在.NET4.7上运行,将PlatformTarget更改为64位,将DebugType更改为便携式。
此外,我更新了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}"
        }
    ,]
}

在这个文件中,我只是将两个JSON对象中的type更改为clr,并将program定位到exe文件。
然后,我可以设置一个断点,只需按F5键就可以在完整的.NET框架上开始调试:

dtcbnfnu

dtcbnfnu3#

https://code.visualstudio.com/docs/languages/csharp
引用:
注意:VS代码不支持调试在桌面. NETFramework上运行的应用程序。
看起来Visual Studio的"全胖" IDE仍然是. Net Framework的一个要求。

mv1qrgav

mv1qrgav4#

遗憾的是,它没有针对C/C的智能感知功能,只有语法突出显示:编辑code.visualstudio.com/docs/languages:也没有为C/C集成调试器。不过git集成真的很不错!调试器似乎更适合Web应用程序,但可以为node.js工作
虽然这并没有指定C#,但显然适用相同的标准(即没有调试器和编译功能)。
引用自对What exactly is Visual Studio Code?的第一个答案的评论

eagi6jfj

eagi6jfj5#

首先,安装Visual Studio 2019生成工具
在VS代码工作区中添加.vscode文件夹并添加tasks.json以生成项目。下面是tasks.json的示例,主要用于任何.Net Framework项目。

{
  "version": "2.0.0",
  "command": "msbuild",
  "args": [ "/property:GenerateFullPaths=true" ],
  "tasks": [{
    "label": "build",
    "problemMatcher": "$msCompile"
  }] 
}

下一步是使F5可以使用VS代码。为了使其工作,请在.vscode文件夹中添加launch.json

{
    "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}"
      }
    ]
  }

注:请根据您的应用程序更改“program”和“cwd

相关问题