Visual Studio 2017更改目标构建时dotnet崩溃

6

目前我正在使用Visual Studio 2017以C#语言构建应用程序。

我需要将目标构建从"AnyPC"更改为"x86"(以便能够调用一些用C编写的非托管dll)。

但是,当我只是在配置管理器(或属性中)更改目标构建->切换到x86平台/目标时,运行应用程序后,dotnet会崩溃并显示错误:"dotnet已停止工作"。

我认为我需要在针对x86目标进行编译时,以某种方式使用dotnet-x86,并在针对x64进行编译时,使用dotnet(x64),以某种方式添加它们的路径,但我不知道如何做到这一点。希望你们能帮助我。

P.S: 我正在使用Windows 10 x64,VS-2017 Community,使用.NET core 2.0

我的程序:

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

调试输出信息:'dotnet.exe' (CoreCLR: 默认域):已加载 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6\System.Private.CoreLib.dll'。跳过载入符号。该模块已被优化,调试器选项“仅限我代码”已启用。 程序 '[7276] dotnet.exe' 已退出,返回值为 255 (0xff)。

关闭“仅限我代码”后的输出信息:'dotnet.exe' (CoreCLR: 默认域):已加载 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6\System.Private.CoreLib.dll'。无法找到或打开 PDB 文件。 程序 '[1764] dotnet.exe' 已退出,返回值为 255 (0xff)。

应用程序图片


你确定在更改构建目标时,你实际上没有使用这些C DLL或任何替代库吗?在C#中编写的代码是否可能在32位平台上出现问题但在64位平台上正常工作?如果是这样,那么你可能已经这样做了,而AnyPC正在使用64位代码而不是使用32位代码。 - Peter Cordes
是的,我制作了一个与这些dll无关的项目,但应用程序崩溃了(dotnet停止工作)。 - Denis
当您使用调试器时,导致崩溃的是哪个机器指令?(或者至少在哪个函数中?)如果这不是由于存储到错误地址或除以零等CPU异常引起的,那么是什么导致了您的.NET运行时停止?您能制作一个包含精确构建说明以重现问题的 [mcve] 吗? - Peter Cordes
我在描述中添加了一些关于我的问题的额外信息,希望这对您有所帮助。 - Denis
“已停止工作”是一个几乎无用的错误信息。关闭“仅限我的代码”以查找真正发生了什么。即使不理解/无法调试汇编语言,将该信息添加到您的问题中可能会帮助某些了解.NET的人告诉您为什么会发生这种情况,或者您的安装可能出了问题。在一个非常微不足道的程序上失败似乎是一个问题。 - Peter Cordes
禁用"Just My Code"后:'dotnet.exe'(CoreCLR: DefaultDomain):已加载'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6\System.Private.CoreLib.dll'。无法找到或打开PDB文件。 程序'[9392] dotnet.exe'已退出,代码为-532462766(0xe0434352)。 - Denis
1个回答

5

谢天谢地,我找到了解决我的问题的正确答案: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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接