gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:22:38 28 4
gpt4 key购买 nike

有没有什么办法可以在 VS 构建时更改输出程序集文件名?

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

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

现在我通过将 AfterBuild 目标添加到 .csproj 来完成此操作,该目标使用重命名复制程序集,但我不喜欢这种解决方案。可以更简单吗?

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

UPD:更清晰的解释,为什么 AssemblyName 更改不是我想要的。 AssemblyName 也是程序集中每个类型的一部分(它指向程序集,type 是从哪里来的)它直接应用于类型解析。例如,我为 ISome 接口(interface)引用了 ProgName.dll。解析器尝试查找 ProgName(在类型的元数据中设置)但一无所获,因为没有 ProgName,只有 ProgName.Test。当它们都具有 AssemblyName ProgName(不是 .Test)时,它将起作用。当然,如果我处理不同的文件名。

UPD2:更好地解释了我所说的关于 AssemblyName 的意思: Resolver data screenshot红色标记的是程序集解析器试图找到的内容。我的两个配置中的程序集都有相同的接口(interface),因此客户不应该关心他需要找到什么程序集。两者应具有相同的 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”。

最佳答案

只是为了说明 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

这不会更改您假定的任何类名或 namespace 。

关于C# 输出程序集文件名 (csproj),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40204195/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com