C#输出程序集文件名(csproj)

时间:2016-10-23 14:44:50

标签: c# visual-studio .net-assembly csproj

在按VS构建时,有没有办法更改输出程序集文件名?

我有两个(四个,包括调试/发布分支​​)配置,功能有点不同,应该以不同的方式使用,但应保留在同一个目录中。所以,最好的是ProjectName.dll和ProjectName.Test.dll。

请不要建议更改AssemblyName参数(我通过Google搜索SO看到的唯一提示),它们不一样。 AssemblyName还会更改每个类的完整类名,但这不是必需的。我想更改文件名并保留在程序集内的任何内容。

现在我已经通过将AfterBuild目标添加到.csproj来复制具有重命名的程序集,但我不喜欢这个解决方案。可能会更容易吗?

还尝试将OutputPath设置为SomeWhere \ ProjectName.Test.dll - 它只是创建dir ProjectName.Test.dll并将$(AssemblyName).dll放在那里。

UPD:更清楚的解释,为什么AssemblyName的改变不是我想要的。 AssemblyName也是程序集中每个类型的一部分(它指向程序集,类型是where),它直接适用于类型resolve。 例如,我为ISome接口引用了ProgName.dll。解析器尝试查找ProgName(在类型的元数据中设置)并且什么也没找到,因为没有ProgName,只有ProgName.Test。当它们都具有AssemblyName ProgName(而不是.Test)时,它将起作用。当然,如果我处理不同的文件名。

UPD2:当谈到AssemblyName时,更好地解释了我的意思: Resolver data screenshot 红色标记是程序集解析器试图找到的。我的两个配置中的程序集具有相同的接口,因此客户端不应该关心他需要查找的程序集。两者都应具有相同的AssemblyName,但文件名不同(存储在同一文件夹中)。

我已经使用ILRepack将多个程序集合并为一个:

  • A.DLL
  • B.dll(或B.Test.dll,取决于配置)
  • C.dll

A和C都引用B.dll。如果我合并B.Test.dll(使用AssemblyName“B.Test”),引用将保持引用。如果我合并B.dll,则没有引用(内部所有代码)。所以我需要B.Test.dll(使用此文件名)才能使AssemblyName为“B”。

1 个答案:

答案 0 :(得分:2)

只是为了说明Luc在评论中已经提到的内容:您可以轻松调整csproj - 文件中的某些行,并实现您的目标。

请看一下这个样本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <someProps>....</someProps>
    <RootNamespace>Your.Project</RootNamespace> <!-- Your project namespace stays the same -->
    <AssemblyName>Your.Project</AssemblyName>
    <someMoreProps>...</someMoreProps>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <AssemblyName>Your.Project.Foo</AssemblyName> <!-- you could simply "override" the resulting assembly name -->
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <samePropsAsAbove>...</samePropsAsAbove>
    <AssemblyName>Your.Project.Bar</AssemblyName> <!-- you could do this on a per-configuration-basis -->
  </PropertyGroup>
  ...

通过这样做,您只需更改生成的输出文件。因此,在此示例中,输出(使用调试配置)将为Your.Project.Foo.dll而不是默认Your.Project.dll

这不会改变您所假设的任何类名或命名空间。