手写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语句,它编译得很好并且可以工作。有人有什么想法吗?
使用/preprocess:flattened.proj
标志运行MSBuild。然后在XML编辑器中加载结果文件。我最近的经验是,当属性没有被看到时,它会在稍后的某个地方被覆盖(例如设置而不是附加到它)或与条件有关的东西。这是一个良好的开端。您也可以尝试获取MSBuildExplorer3,看看它是否有任何结果。我不熟悉C#项目,但我认为你应该找到$(RootNamespace)
实际用于其效果的位置,并向后追溯:它是因为某个条件而被忽略的吗,没有得到你期望的目标变化,等等。一旦你知道了情况,就用/verbosity:diag
和grep运行MSBuild,为它(应该)使用的目标运行它,看看它在想什么。
将Pierre Luc的反馈复制到一个答案中:rootnamespace似乎只是建议IDE在创建类时注入。如果.cs文件没有指定命名空间,rootnamespace将而不是成为这些类的命名空间。关于这个问题的更多信息。