【问题标题】:Visual Studio 2017 dotnet crash when changing target build更改目标构建时 Visual Studio 2017 dotnet 崩溃
【发布时间】:2018-09-16 21:09:29
【问题描述】:

目前我正在 Visual Studio 2017 中使用 C# 构建应用程序。 我需要将目标构建从“AnyPC”更改为“x86”(以便能够调用一些用 C 编写的非托管 dll)。 但是当我只是在配置管理器(或属性)中更改目标构建时->切换到 x86 平台/目标;在此之后我运行应用程序,dotnet 崩溃并出现错误:“dotnet 已停止工作”。

我认为我需要在为 x86 目标编译时以某种方式使用 dotnet-x86,并在为 x64 编译时使用 dotnet(x64),以某种方式添加它们的路径,但我不知道该怎么做。希望大家帮帮我

P.S:我正在使用 .NET core 2.0 开发 Windows 10 x64,VS-2017 社区

我的程序:

 class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Need Help");
        Console.ReadKey();
    }
}

调试输出:“dotnet.exe”(CoreCLR:DefaultDomain):已加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6\System.Private.CoreLib.dll”。跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。 程序“[7276] dotnet.exe”已退出,代码为 255 (0xff)。

或禁用“仅我的代码”:'dotnet.exe' (CoreCLR: DefaultDomain): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6\System.Private.CoreLib .dll'。无法找到或打开 PDB 文件。 程序“[1764] dotnet.exe”已退出,代码为 255 (0xff)。

image of application

【问题讨论】:

  • 您确定在更改构建目标时实际上没有使用这些 C DLL 或任何替代库吗?是否可以用 C# 编写在 32 位平台上中断但在 64 位上工作的代码?如果是这样,也许您已经这样做了,并且 AnyPC 正在使用 64 位而不是使用 32 位代码来伪装自己?
  • 是的,我做了一个与这些 dll 无关的项目,无论如何应用程序正在崩溃(dotnet 停止工作)
  • 使用调试器时,哪个机器指令导致崩溃? (或者至少它在什么函数中?)或者如果它不是存储到错误地址或除以零或其他什么的 CPU 异常,那么 是什么导致您的 dotnet 运行时停止?你能写一个minimal reproducible example,包括准确的构建说明来重现你的问题吗?
  • 我在描述中添加了一些关于我的问题的额外信息,希望这能有所帮助
  • “已停止工作”是一条几乎无用的错误消息。关闭“只是我的代码”以找出真正发生的事情。即使 不懂/无法调试汇编语言,将这些信息添加到您的问题中可能会帮助那些可以(并且知道.NET,我不知道>.

标签: c# .net visual-studio x86 target


【解决方案1】:

谢天谢地,我找到了解决问题的正确答案:https://github.com/dotnet/cli/issues/7532


.NET Core CLI 团队提到修复如下:

https://www.microsoft.com/net/download/core 安装 x86 和 x64 .NET Core 2.0 SDK。将以下内容放入项目文件上方某个名为 Directory.Build.targets 的文件中(例如源存储库的根目录)。 MSBuild 将自动为所有项目选择它:

<Project>
  <PropertyGroup 
      Condition="'$(OS)' == 'Windows_NT' and
                 '$(TargetFrameworkIdentifier)' == '.NETCoreApp' and
                 '$(SelfContained)' != 'true'"
                  >
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>
    <RunCommand Condition="'$(PlatformTarget)' == 'x64'">$(ProgramW6432)\dotnet\dotnet</RunCommand>
  </PropertyGroup>
</Project>

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多