我有两个关于激活上下文API和SxS清单的问题。它们看起来很简单,但我仍然找不到任何好的答案。
我有两个dll库,文件名分别为foo.dll和bar.dll,它们都有嵌入的清单,foo依赖于bar。有没有办法给这两个文件分配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> 发布于 2018-09-06 19:38:01
如果不是嵌入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时发生了什么,以及它在何处无法解析它的一些dependencies.https://stackoverflow.com/questions/49015320
复制相似问题