C++ SxS清单中的程序集标识名

C++ SxS清单中的程序集标识名,c++,dll,winsxs,sxs,activation-context-api,C++,Dll,Winsxs,Sxs,Activation Context Api,关于激活上下文API和SxS清单,我有两个问题。它们看起来很简单,但我仍然找不到任何好的答案 我有两个文件名为foo.dll和bar.dll的dll库,它们都带有嵌入式清单,foo依赖于bar。是否有任何方法可以使用assemblyIdentity名称而不是文件名来分配这两个?例如,如果我希望bar.dll的程序集标识为CompanyName.Subsection.bar?如果我像这样更改它的标识-我在尝试加载foo.dll“Dependent Assembly CompanyName.Subs

关于激活上下文API和SxS清单,我有两个问题。它们看起来很简单,但我仍然找不到任何好的答案


我有两个文件名为foo.dll和bar.dll的dll库,它们都带有嵌入式清单,foo依赖于bar。是否有任何方法可以使用assemblyIdentity名称而不是文件名来分配这两个?例如,如果我希望bar.dll的程序集标识为
CompanyName.Subsection.bar
?如果我像这样更改它的标识-我在尝试加载foo.dll
“Dependent Assembly CompanyName.Subsection.bar,type=“win32”,version=“0.1.2.3”时出错“
。当然,如果我将名称程序集标识指定为文件名(
),则可以将bar.dll的清单与dll本身一起放在单独的文件夹中,而不是嵌入其中。例如:

foo.dll
CompanyName.Subsection.bar/
├── bar.dll
└── CompanyName.Subsection.bar.manifest
您仍然需要将第一个清单嵌入foo.dll。我相信您可以从该清单中删除以下代码段,因为它是一个嵌入清单,因此不需要指定dll属于程序集的内容:

<file name="foo.dll">
</file>

bar.dll的清单很好,但请确保文件夹和清单文件的名称与
assemblyIdentity
元素中指定的名称完全一致(请参见上面的文件夹结构示例)

另外请注意,您可以使用命令行工具诊断与加载SxS程序集相关的问题。分步说明:

  • 从Visual Studio命令行运行
    sxstrace trace-logfile:mytrace.etl
    。在按ENTER键之前,该命令不会返回。但是,请先不要按ENTER键
  • 启动加载foo.dll的应用程序以重现问题
  • 然后在命令行窗口中按ENTER键停止sxstrace
  • 您现在有一个文件mytrace.etl,它不是人类可读的。通过运行
    sxstrace parse-logfile:mytrace.etl-outfile:mytrace.txt
    ,将其转换为可读格式。您将得到一个文件mytrace.txt,其中显示加载foo.dll时发生的情况以及无法解析其某些依赖项的位置
  • <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity name="CompanyName.Subsection.bar" version="0.1.2.3" type="win32"/>
    <file name="bar.dll">
    </file>
    </assembly> 
    
    <file name="foo.dll">
    </file>