强命名程序集XAML引用内部类出现编译错误求助
排查强命名后XAML访问内部类型的编译错误
我碰到过几乎一模一样的问题,这本质上是XAML编译器在处理强命名程序集时,对InternalsVisibleTo的验证逻辑和C#编译器不一致导致的。结合你的场景,给你几个针对性的排查和解决方向:
1. 再次确认InternalsVisibleTo的公钥格式完全正确
虽然你提到用了正确的完整公钥,但XAML编译器对这个字符串的格式异常敏感,哪怕一个字符错误或格式不对都会导致授权失效:
- 用
sn.exe工具重新导出Company.OtherLibrary的完整公钥:sn -Tp Company.OtherLibrary.dll - 复制输出的完整公钥字符串(注意不是短版的公钥令牌),粘贴到
Company.Component的AssemblyInfo.cs中,确保没有多余的空格、换行或截断:[assembly: InternalsVisibleTo("Company.OtherLibrary, PublicKey=0024000004800000940000000602000000240000525341310004000001000100...")]
2. 修改XAML命名空间,明确指定程序集强命名信息
强命名后,XAML在引用跨程序集的内部类型时,可能需要在命名空间声明中补充程序集的公钥(这是XAML编译器的特殊校验要求)。修改你的转换器命名空间:
xmlns:converters="clr-namespace:Company.Component.Converters;assembly=Company.Component, PublicKey=你的Company.Component完整公钥"
替换成Company.Component自身的完整公钥,帮助XAML编译器精准匹配强命名程序集。
3. 切换为项目引用而非程序集引用
如果Company.OtherLibrary当前引用的是Company.Component的dll文件,尝试改为项目引用:
- 移除现有的dll引用,右键
Company.OtherLibrary项目 → 添加引用 → 项目 → 选择Company.Component - 清理并重建整个解决方案
这种方式下,XAML编译器能直接读取到Company.Component项目的InternalsVisibleTo设置,避免因为dll缓存或强命名元数据不匹配导致的授权问题。
4. 清理XAML专属的设计时缓存
虽然你已经清理了常规缓存,但XAML还有一个隐藏的设计时缓存目录,手动清理它:
- 关闭VS 2017
- 删除以下目录的内容(替换
*为你的VS实例ID):%LOCALAPPDATA%\Microsoft\VisualStudio\15.0_*\Designer\ShadowCache - 重启VS并重新构建项目
为什么C#测试项目正常但XAML不行?
C#编译器和XAML编译器的类型访问校验逻辑是独立的:C#编译器会直接读取目标程序集的InternalsVisibleTo属性并授权,但XAML编译器在处理强命名程序集时,对授权的验证更严格,且依赖于完全匹配的程序集元数据——这就是为什么测试项目能正常访问内部类型,但XAML会报错的核心原因。
内容的提问来源于stack exchange,提问作者Erik Nyström




