MSBuild命令行传入AssemblyName参数导致构建错误的原因咨询
问题根因
这个错误的核心原因是MSBuild命令行通过/p传入的属性是全局属性,会覆盖解决方案下所有项目的同名属性,不是只作用于你要发布的主项目。
- 从错误码
BC前缀可以判断你的项目是VB.NET项目。你在命令行全局指定AssemblyName时,解决方案中被主项目引用的MyForms类库项目,它自身的AssemblyName属性也会被强制改成你传入的$assemblyName值,不再是原本的MyForms。 - VB.NET项目会默认在项目级别配置全局导入,自动加载引用程序集的命名空间。当MyForms项目编译出的程序集名和主项目引用记录里的
MyForms不匹配时,编译器就找不到该程序集内的公共成员,先触发BC40057命名空间/类型找不到的警告,后续编译到引用InvokedArgs类型的代码时,就会抛出BC30002类型未定义的错误。 - 你在主项目的条件
PropertyGroup里配置AssemblyName时,这个配置仅对当前主项目生效,不会修改同解决方案下其他类库项目的配置,MyForms的程序集名保持正常,所以构建可以顺利完成。
命令行传参的可行解决方案
你不需要放弃命令行动态传参,用以下任意一种方式都可以满足自动化构建的需求,同时避免属性全局覆盖的问题:
- 直接构建主项目文件而非解决方案文件
把命令里的解决方案路径替换为主项目的.vbproj文件路径,此时传入的AssemblyName只会作用于主项目本身,不会影响被引用的MyForms类库:MSBuild -m $mainProjectVbprojPath /p:Configuration=$buildConfigName /t:publish /p:AssemblyName=$assemblyName;PublishDir="$publishPath\\" - 保留解决方案构建,通过项目专属属性语法传参
如果你的构建流程必须基于解决方案文件执行,可以用MSBuild原生支持的项目专属属性写法,仅给指定主项目设置AssemblyName。你只需要把命令里的AssemblyName改成[你的主项目在解决方案中的名称]_AssemblyName即可,比如主项目在解决方案里叫myAppMain,就写myAppMain_AssemblyName:
这种写法传入的属性只会应用到名称匹配的项目上,不会影响解决方案里的其他类库项目。MSBuild -m $solutionFile /p:Configuration=$buildConfigName /t:publish /p:myAppMain_AssemblyName=$assemblyName;PublishDir="$publishPath\\"
内容的提问来源于stack exchange,提问作者Bitfiddler
相关产品推荐
相关产品推荐

