You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何共享通用程序集属性且避免发布失败?

在MVC项目中使用类库共享程序集属性避免发布失败的方案

我来帮你解决这个问题——在MVC项目里用类库共享程序集属性时,确实容易因为编译/发布的机制问题踩坑,下面是经过验证的可靠方案:

先搞懂为什么直接引用会出问题

你现在写的静态常量类,要是直接在MVC项目的AssemblyInfo.cs里这么用:

[assembly: AssemblyCompany(AdministrationAssemblyInfo.Company)]

表面上编译能过,但实际上CLR会把常量值内联到MVC项目的程序集里,而且还会带来两个关键问题:

  • 如果类库的编译顺序在MVC项目之后,编译阶段就可能报错;
  • 发布时如果类库程序集没被正确复制到目标目录,或者编译缓存导致值不一致,就会触发发布失败。

推荐方案:用MSBuild属性共享(最可靠)

这是.NET生态里官方推荐的共享程序集属性的方式,完全避开常量内联和依赖问题:

  1. 在类库项目中创建共享属性文件
    在你的Conwell.Manifest类库中新建一个名为SharedAssemblyInfo.props的XML文件(注意后缀是.props,不是.cs),内容如下:

    <Project>
      <PropertyGroup>
        <Company>Foo</Company>
        <Trademark>Bar</Trademark>
        <Copyright>Baz</Copyright>
        <AssemblyVersion>1.0.*</AssemblyVersion>
        <ProductName>Administration</ProductName>
      </PropertyGroup>
    </Project>
    
  2. 在类库和MVC项目中导入这个文件

    • 打开类库的.csproj文件,添加一行导入语句:
      <Import Project="SharedAssemblyInfo.props" />
      
    • 打开MVC项目的.csproj文件,同样添加导入语句(注意路径要对应类库的位置,比如类库在../Conwell.Manifest目录下,路径就是../Conwell.Manifest/SharedAssemblyInfo.props):
      <Import Project="../Conwell.Manifest/SharedAssemblyInfo.props" />
      
  3. 清理重复的AssemblyInfo配置
    删除类库和MVC项目中AssemblyInfo.cs里已经在SharedAssemblyInfo.props中定义的属性(比如AssemblyCompany、AssemblyTrademark这些),让MSBuild在编译阶段自动注入这些值。

如果你坚持要用静态类的兼容方案

要是你不想改结构,一定要保留原来的静态常量类,那得做好这几点避免发布失败:

  • 确保类库是MVC项目的直接依赖项,并且在解决方案的编译顺序中,类库优先于MVC项目编译(右键解决方案→项目依赖项,调整顺序);
  • 对于老的.NET Framework MVC项目,右键类库引用→属性,把Copy Local设为True,确保发布时类库程序集被复制到目标目录;
  • 把AssemblyVersion = "1.0.*"从静态类里移出来,放到MSBuild属性里处理——因为1.0.*是MSBuild在编译时自动生成的版本号,作为常量会导致编译冲突。

额外注意事项

  • 对于.NET Core/.NET 5+的MVC项目,SDK默认会自动生成AssemblyInfo内容,你可以在.csproj中添加<GenerateAssemblyInfo>false</GenerateAssemblyInfo>来禁用自动生成,避免和自定义配置冲突;
  • 发布前先执行清理解决方案→重新生成解决方案,清除编译缓存,避免旧值干扰。

内容的提问来源于stack exchange,提问作者Christian Gollhardt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:23