【发布时间】:2015-05-07 23:14:35
【问题描述】:
我必须创建一个自定义 MSBuild 目标,因为我有多个具有命名约定的 CS 文件,并且所有文件(主要是 1-3 个文件)都必须编译到一个程序集中。为简单起见,我们假设每个 DLL 有 1 个文件。这意味着有:
files/file1.cs
files/file2.cs
files/file3.cs
在输出中应该有 File1.dll, File2.dll File3.dll
所以我创建了一个自定义 MSBuild 目标,如下所示:
<ItemGroup>
<CSFile Include="file\*.cs" Exclude="" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.dll"/>
<Reference Include="..\libs\customdll.dll"/>
</ItemGroup>
<Target Name="CompileFiles" Inputs="@(CSFile)" Outputs="$(OutputPath) (CSFile.Filename).dll" >
<CSC Sources="%(CSFile.Identity)" TargetType="library" OutputAssembly="$(OutputPath)%(CSFile.Filename).dll" References="@(Reference)"/>
</Target>
它在某些时候起作用了,但是现在当我想将一些 Nuget 包连接到它时(它与 NuGet 本身无关,但是当我尝试更改一些引用路径时它出现了)和
<Reference Include="..\libs\customdll.dll"/>
改为
<Reference Include="customdll"/>
<HintPath>..\libs\customdll.dll</HintPath>
</Reference>
它根本不起作用。看起来 MSBuild 没有正确解析引用,并且只使用“包含”属性中的值。它不检查提示路径、系统路径等。此外,当我尝试将DependsOnTargets="ResolveAssemblyReferences" 添加到Target 时,我会在调用CSC 时看到引用中的完整路径(当@(Reference) 更改为@(ReferencePath) ),但令人惊讶的是,一些基本参考,如 System 或 System.Core 等似乎被多次包含,编译器抱怨我必须删除重复项。即使我从<ItemGroup><Reference>.. 中删除它们,错误仍然相同。
所以一般有2种错误。第一个基本上说Metadata fileSystemcould not be found,当我不使用Microsoft.CSharp中常见目标中的ResolveAssemblyReferences目标时,这基本上意味着它无法解析引用,第二个错误是当我使用它并且引用被解析时正确,但以某种方式多次包含库,但仍然无法编译。
知道如何解决这个问题吗?或者,如果没有 VisualStudio 生成的完整工作 CSPROJ,我的 MSBuild 目标应该如何按照某些标准实现 DLL 的目标。
我已经尝试过 MSBuild 工具 4.0、12.0。以及.NET4.0/.NET4.5目标框架的各种组合。
【问题讨论】:
-
Nuget 包预计会加载到“标准”C# 项目中,并基于此假设修改项目文件。在恢复 Nuget 后解开或手动提取 nuget 包(它们只是 zip 文件)。
标签: c# visual-studio msbuild