Visual Studio可以构建调试配置,但无法构建发布配置。

7

这个问题非常严重。

在我的当前配置中,只有当项目处于调试配置时,Visual Studio 2013才会构建我的项目,而不是当它处于发布配置时。

不知何故,当我选择发布配置时,会出现160个错误,当我开始检查它们时,发现它们都在不可能的地方。下面是其中一个示例。

Visual Studio的错误如下:

Error 3 ; expected E:\Users\Robert\Documents\Visual Studio 2013\Projects\GW2.NET\GW2.NET\GW2.NET\V1\MapInformation\DataProvider\ContinentData.cs 96 36 GW2.NET

这是相关代码:

public static async Task<T> GetContentAsync<T>(string apiMethod, List<KeyValuePair<string, object>> arguments, Categories category)
    {
        var response = await GetJsonAsync(apiMethod, arguments, category);

        return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<T>(response));
    }

你看,这里没有任何错误。如果有错误的话,Debug配置也不能成功构建。我已经尝试了清理解决方案并从TFS获取最新版本,并删除和重新创建了配置文件。

现在我束手无策。我该如何解决这个问题呢?

该项目是一个C# 4.0项目,使用了Microsoft async、JSON.NET和Rest#包。

3个回答

10

如果你真的卡住了,可以尝试在文本或XML编辑器中打开.csproj文件并检查其中实际的XML内容。你需要弄清楚基于Debug/Release配置有哪些设置/属性不同。这可能会让你对两个配置之间的差异有一些了解。


我来这里是因为我有一个解决方案,在Release模式下可以编译,但在Debug模式下无法编译。问题在于,一个C++组件项目需要C++17,尽管已设置为如此,在调试中它仍然忽略了C++17的特性,并将它们显示为错误。结果发现,在<ClCompile>下其语言规范在其.vcxproj文件中不存在。 - Ian Bland

9

如果其他人也有同样的问题,这是我所做的。感谢Dylan Smith,我找到了解决方案。

用你选定的文本编辑器打开.csproj文件。我使用Notepad++,但 Visual Studio 也可以。在顶部应该有一个名为PropertyGroup的元素。这些元素定义你的构建配置。对我来说,有两个:

一个是Debug

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
        <PlatformTarget>x86</PlatformTarget>
        <DocumentationFile>bin\Debug\GW2.NET.XML</DocumentationFile>
    </PropertyGroup>

还有一个关于发布的:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <DebugType>none</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>bin\Release\</OutputPath>
        <DefineConstants>TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
        <DocumentationFile>bin\Release\GW2.NET.XML</DocumentationFile>
        <LangVersion>4</LangVersion>
        <PlatformTarget>x86</PlatformTarget>
    </PropertyGroup>

除了明显的区别,前两个节点(DebugSymbolsDebugType)之外,主要的区别在于LangVersion元素。我删除了它,项目也可以在发布模式下构建了。
所以,如果您有和我一样的问题,请打开.csproj文件并删除此节点。这应该可以解决问题。
P.S.: LangVersion元素是什么意思?如果我将它从4改为4.0,我会得到以下错误消息:

/langversion的选项'4.0'无效;必须为ISO-1、ISO-2、3、4、5或Default。


LangVersion 是 C# 语言/语法的版本,编译器将使用该版本。您在代码中使用的 async 和 await 特性仅适用于 C# 5+。因此,在 csproj 中将 LangVersion 设置为 4 将导致编译器失败。 - Dylan Smith
即使 async/await 关键字来自于 MS BCL 包,我们仍然使用这些关键字,因为我们需要向后兼容,所以我们的目标是 c# 4.0。 - Ruhrpottpatriot
async/await关键字是C#5的一部分,而不是BCL。任务并行库(这些是用于实现异步概念的BCL类型)是.NET 4的一部分,但如果您想使用async/await关键字的语法糖,您需要使用C#5.如果您想在C#4中执行异步操作,则必须直接使用任务类型。 - Dylan Smith

1

如果您正在使用Visual Studio 2010构建WiX设置项目,并且使用自定义对话框,而且您的项目在调试模式下可以构建,但在发布模式下无法构建,则请转到菜单项目属性→将工具设置设置为发布模式并选中复选框抑制ICE验证


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