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

关于Activation Context API与SxS清单的技术疑问:自定义Assembly Identity名称

关于SxS清单中自定义assemblyIdentity名称的问题解答

嘿,这个问题其实挺常见的,很多人第一次尝试自定义SxS程序集标识时都会踩坑。先直接给你答案:完全可以给DLL分配非文件名的assemblyIdentity名称,你遇到错误大概率是因为清单配置里的依赖关系没对应上,或者激活上下文的解析逻辑没处理好。

下面给你拆解可能的问题点和解决思路:

  • 首先明确:assemblyIdentity的name字段和DLL文件名不需要强制一致,这正是SxS(并行程序集)设计的灵活性之一。你把bar.dll的assemblyIdentity设为CompanyName.Subsection.bar是完全合规的操作。

  • 那你修改后出错的原因,大概率是这几个细节没做好:

    1. 依赖声明不匹配
      bar.dll的嵌入清单里的assemblyIdentity必须和foo.dll清单中依赖项的assemblyIdentity完全一致——包括name、version、processorArchitecture、publicKeyToken、type这所有字段。
      举个例子,bar的清单如果是这样:

      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <assemblyIdentity 
          name="CompanyName.Subsection.bar" 
          version="1.0.0.0" 
          processorArchitecture="x86" 
          publicKeyToken="abc123def456" 
          type="win32" />
      </assembly>
      

      那foo的清单里对bar的依赖必须一字不差地对应:

      <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <assemblyIdentity 
          name="CompanyName.Subsection.foo" 
          version="1.0.0.0" 
          processorArchitecture="x86" 
          publicKeyToken="abc123def456" 
          type="win32" />
        <dependency>
          <dependentAssembly>
            <assemblyIdentity 
              name="CompanyName.Subsection.bar" 
              version="1.0.0.0" 
              processorArchitecture="x86" 
              publicKeyToken="abc123def456" 
              type="win32" />
          </dependentAssembly>
        </dependency>
      </assembly>
      

      任何一个字段不匹配,系统都会找不到依赖的程序集,直接报错。

    2. 激活上下文的路径问题
      当assemblyIdentity名称和DLL文件名不一致时,系统默认的搜索逻辑可能找不到你的bar.dll。如果你的DLL不是放在系统默认的SxS目录下,你需要通过Activation Context API手动指定程序集的查找路径:

      • 使用CreateActCtx函数创建激活上下文,在ACTCTX结构体中设置lpAssemblyDirectory为bar.dll所在的目录;
      • 或者确保你的清单中包含<file>元素,明确指定DLL的文件名:
        <file name="bar.dll" />
        
        这个元素会告诉系统,对应这个assemblyIdentity的程序集文件是bar.dll。
    3. 签名验证失败
      如果你的assemblyIdentity里填写了publicKeyToken,但实际没有用对应的密钥对DLL进行签名,系统会验证失败并拒绝加载。测试阶段可以暂时去掉publicKeyToken字段,或者用自签名证书给两个DLL完成签名。

  • 最后给你一个快速排查的小技巧:
    打开Windows的事件查看器,转到「Windows日志 -> 应用程序」,里面会记录SxS加载失败的详细错误信息——比如是哪个字段不匹配,还是找不到文件,这比盲目试错高效得多。另外也可以用mt.exe工具提取两个DLL的嵌入清单,直接对比内容是否一致。

内容的提问来源于stack exchange,提问作者Ibraim Ganiev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:31:54