我有两个关于激活上下文API和SxS清单的问题。它们看起来很简单,但我仍然找不到任何好的答案。
我有两个带文件名foo.dll和bar.dll的dll库,两者都带有嵌入式清单,foo取决于吧。有没有办法用assemblyIdentity名称而不是文件名分配这两个?例如,如果我想要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程序集相关的问题。分步说明:
sxstrace trace -logfile:mytrace.etl
。在按ENTER键之前,该命令不会返回。但是,不要按ENTER键。sxstrace parse -logfile:mytrace.etl -outfile:mytrace.txt
将其转换为可读格式。你得到一个文件mytrace.txt,它显示了当你加载foo.dll时它会发生什么,以及它无法解决它的某些依赖项。