手写msbuild忽略c#dll的rootnamespace

本文关键字:rootnamespace c#dll 忽略 msbuild 手写 | 更新日期: 2023-09-27 18:24:13

我正在进行一个自动化的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语句,它编译得很好并且可以工作。有人有什么想法吗?

手写msbuild忽略c#dll的rootnamespace

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

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