如何让项目AssemblyInfo.cs覆盖GlobalAssemblyInfo.cs中的程序集属性?
针对共享程序集属性冲突的解决方案
好问题!我刚好碰到过类似的场景,C#里确实没有类似 [assembly: @override ComVisible(true)] 这种直接覆盖程序集属性的语法,不过咱们有几种更高效的替代方案,不用非得把属性从全局文件移除再挨个添加到所有项目里:
1. 用条件编译指令精准控制
这是我最常用的方案,步骤很简单:
- 打开你的
GlobalAssemblyInfo.cs,把冲突的属性改成带条件编译的形式:// 只有当不是特殊项目时,才应用这个默认值 #if !OVERRIDE_COMVISIBLE [assembly: ComVisible(false)] #endif - 找到那个需要特殊值的项目,右键→属性→生成→在「条件编译符号」里添加
OVERRIDE_COMVISIBLE(多个符号用分号分隔) - 最后在这个项目自己的
AssemblyInfo.cs里加上:[assembly: ComVisible(true)]
这样编译时,全局文件里的默认属性会被跳过,只会用项目本地的属性,完美避免冲突。
2. 拆分共享属性文件(优化版手动方案)
如果你不想用条件编译,也不用逐个给项目加属性:
- 先把
ComVisible属性从GlobalAssemblyInfo.cs里删掉 - 新建一个
DefaultComVisibleAssemblyInfo.cs文件,里面只写[assembly: ComVisible(false)],然后用「Add As Link」的方式添加到除了特殊项目之外的所有项目里 - 特殊项目直接在自己的
AssemblyInfo.cs里写[assembly: ComVisible(true)]就行
这种方式比全手动添加省了不少事,大部分项目还是复用共享文件。
3. 用MSBuild配置动态控制(进阶方案)
如果你的项目是较新的SDK风格项目,还可以直接通过项目文件来设置,不用维护AssemblyInfo里的属性:
- 先把
ComVisible从所有AssemblyInfo文件里删掉 - 打开普通项目的
.csproj文件,添加这段配置:<PropertyGroup> <!-- 默认设置为false --> <ComVisible>false</ComVisible> </PropertyGroup> - 特殊项目的
.csproj里改成:<PropertyGroup> <ComVisible>true</ComVisible> </PropertyGroup>
MSBuild会自动把这个值注入到程序集属性里,完全不用手动写[assembly: ComVisible(...)],非常灵活。
内容的提问来源于stack exchange,提问作者Raimund Krämer
相关产品推荐
相关产品推荐

