【问题标题】:handwritten msbuild ignores rootnamespace for c# dll手写的 msbuild 忽略 c# dll 的 rootnamespace
【发布时间】:2014-09-26 02:52:34
【问题描述】:

我正在开发一个自动化的 c# 构建,它需要我编写/生成 csproj 文件,然后使用命令行对其进行编译。由于某种原因,当 dll 创建时没有问题,它包含的类被转储到全局命名空间中,而不是我在 .有谁知道这里可能发生了什么?

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <OutputType>Library</OutputType>
        <RootNamespace>SimpleDependency.Test</RootNamespace>
        <AssemblyName>simpledependency.test</AssemblyName>
        <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
        <FileAlignment>512</FileAlignment>
    </PropertyGroup>
    <ItemGroup>
        <Compile Include="*.cs" />
    </ItemGroup>
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <DebugType>pdbonly</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>Bin\Release\</OutputPath>
        <DefineConstants>TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
    </PropertyGroup>
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

我已将 msbuild 设置为 .net 4.0,并在命令行上运行此命令:

msbuild /property:Configuration=Release /property:Platform=AnyCPU

我知道它成功生成了 dll,因为我有另一个依赖项目使用我在这个项目中定义的类,但如果我包括:

using SimpleDependency.Test;

在该代码中,我收到编译错误,说它找不到命名空间“SimpleDependency”。没有这个 using 语句,它编译得很好并且可以工作。有人有什么想法吗?

【问题讨论】:

  • 您的类是否使用 SimpleDependency.Test 命名空间定义?定义 RootNamespace 不会在所有没有命名空间的类中强制执行它。
  • 定义根命名空间的全部意义在于不必在所有类中编写它
  • 对不起,这应该是一个问题,这不是根命名空间的重点吗?
  • 好吧,我认为它不会覆盖已经编写的没有任何显式命名空间的 .cs 文件。更多细节在this question.
  • 明白了。我猜当您设置根命名空间时,Visual Studio 必须将其注入您创建的每个新类中。

标签: c# .net dll msbuild


【解决方案1】:

使用 /preprocess:flattened.proj 标志运行 MSBuild。然后在 XML 编辑器中加载生成的文件。我最近的经验是,当看不到属性时,它会在稍后的某个地方被覆盖(例如,设置而不是附加到它)或有关条件的东西。这是一个好的开始。您也可以尝试获取 MSBuildExplorer3 并查看是否有任何结果。我不熟悉 C# 项目,但我认为您应该找到 $(RootNamespace) 实际用于其效果的位置,并向后追溯:它是否由于某种条件而被忽略,没有得到您期望的目标变化等。一旦你了解情况,使用/verbosity:diag 运行 MSBuild,然后通过 grep 查找它(应该)使用的目标,看看它在想什么。

【讨论】:

  • 谢谢,原来我遇到了另一个问题,但是这些技术(msbuildexplorer 3 和预处理:)肯定会在我将来遇到其他问题时帮助我整理出更多信息。
  • 是的,当我弄清楚这一点时,知道如何找出正在发生的事情是主要推动力。
【解决方案2】:

将 Pierre-Luc 的反馈复制到答案中:rootnamespace 似乎只是对 IDE 的建议,以便在创建类时注入。如果 .cs 文件没有指定命名空间,根命名空间将不会成为这些类的命名空间。更多关于这个问题的信息this question.

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2019-04-24
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多