如何共享通用程序集属性且避免发布失败?
在MVC项目中使用类库共享程序集属性避免发布失败的方案
我来帮你解决这个问题——在MVC项目里用类库共享程序集属性时,确实容易因为编译/发布的机制问题踩坑,下面是经过验证的可靠方案:
先搞懂为什么直接引用会出问题
你现在写的静态常量类,要是直接在MVC项目的AssemblyInfo.cs里这么用:
[assembly: AssemblyCompany(AdministrationAssemblyInfo.Company)]
表面上编译能过,但实际上CLR会把常量值内联到MVC项目的程序集里,而且还会带来两个关键问题:
- 如果类库的编译顺序在MVC项目之后,编译阶段就可能报错;
- 发布时如果类库程序集没被正确复制到目标目录,或者编译缓存导致值不一致,就会触发发布失败。
推荐方案:用MSBuild属性共享(最可靠)
这是.NET生态里官方推荐的共享程序集属性的方式,完全避开常量内联和依赖问题:
在类库项目中创建共享属性文件
在你的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>在类库和MVC项目中导入这个文件
- 打开类库的
.csproj文件,添加一行导入语句:<Import Project="SharedAssemblyInfo.props" /> - 打开MVC项目的
.csproj文件,同样添加导入语句(注意路径要对应类库的位置,比如类库在../Conwell.Manifest目录下,路径就是../Conwell.Manifest/SharedAssemblyInfo.props):<Import Project="../Conwell.Manifest/SharedAssemblyInfo.props" />
- 打开类库的
清理重复的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
相关产品推荐
相关产品推荐

