rat*_*ler 5 c# csproj .net-assembly visual-studio
通过 VS 构建时,有什么方法可以更改输出程序集文件名?
我有两个(四个,包括 Debug/Release 分支)配置,它们的功能有点不同,应该以不同的方式使用,但应该保持在同一个目录中。因此,最好的是 ProjectName.dll 和 ProjectName.Test.dll。
请不要建议更改 AssemblyName 参数(我通过谷歌搜索 SO 看到的唯一提示),它们不一样。AssemblyName 还会更改每个类的完整类名,这是不希望的。我想改变只有文件名和内保持任何组件unthouched。
现在我已经通过将 AfterBuild 目标添加到 .csproj 中来完成此操作,该 .csproj 使用重命名复制程序集,但我不喜欢这个解决方案。可以更容易吗?
还尝试将 OutputPath 设置为 SomeWhere\ProjectName.Test.dll - 它只是创建目录 ProjectName.Test.dll 并将 $(AssemblyName).dll 放在那里。
UPD:更清晰的解释,为什么 AssemblyName 更改不是我想要的。AssemblyName 也是程序集中每个类型的一部分(它指向程序集,类型来自哪里),它直接应用于类型解析。例如,我为 ISome 接口引用了 ProgName.dll。解析器尝试查找 ProgName(在类型的元数据中设置)但什么也没找到,因为没有 ProgName,只有 ProgName.Test。当它们都具有 AssemblyName ProgName(不是 .Test)时,它将起作用。当然,如果我处理不同的文件名。
UPD2:更好地解释我在谈到 AssemblyName 时的意思:
红色标记的是程序集解析器试图找到的内容。我的两个配置中的程序集具有相同的接口,因此客户不必关心他需要找到什么程序集。两者都应该具有相同的 AssemblyName,但不同的文件名(存储在同一文件夹中)。
我使用 ILRepack 将多个程序集合并为一个:
A 和 C 都引用了 B.dll。如果我改为合并 B.Test.dll(使用 AssemblyName“B.Test”),则引用将保持引用。如果我合并 B.dll,则不会保留任何引用(里面的所有代码)。所以我需要 B.Test.dll(使用这个文件名)来拥有 AssemblyName“B”。
只是为了说明 Luc 在他的评论中已经提到的内容:您可以轻松地调整csproj-file 中的一些行并实现您正在寻找的内容。
请看一下这个示例:
<?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>
...
Run Code Online (Sandbox Code Playgroud)
通过这样做,您只需更改生成的输出文件。所以在这个例子中,输出(使用调试配置)将Your.Project.Foo.dll代替默认的Your.Project.dll.
这不会更改您假设的任何类名或命名空间。
| 归档时间: |
|
| 查看次数: |
7048 次 |
| 最近记录: |