我有两个有关激活上下文API和SXS的问题。他们看起来很简单,但我仍然找不到任何好答案。
我有两个带有文件名foo.dll和bar.dll的DLL库,均带有嵌入式清单,Foo取决于bar。除了文件名以外,还有什么方法可以用汇编名称分配这两个?例如,如果我希望bar.dll的汇编身份为 CompanyName.Subsection.bar
?如果我更改它是这样的身份 - 尝试加载foo.dll "Dependent Assembly CompanyName.Subsection.bar,type="win32",version="0.1.2.3" could not be found"
时会出现错误。当然,如果我将姓名汇编身份指定为文件名(<assemblyIdentity name="bar"
(,一切都有效,但是有一种方法可以使用这些虚线名称吗?
foo.dll
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="foo" version="0.1.2.3" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity name="CompanyName.Subsection.bar" version="0.1.2.3" type="win32" />
</dependentAssembly>
</dependency>
<file name="foo.dll">
</file>
</assembly>
bar.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>
可以做到,如果而不是嵌入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
元素中指定的清单文件(请参见上面的示例文件夹结构(。
还要注意,您可以诊断使用SXSTRACE命令行工具加载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以及无法解决其某些依赖关系时。