SxS清单中的程序集标识名称

问题描述 投票:2回答:1

我有两个关于激活上下文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> 
c++ dll winsxs sxs activation-context-api
1个回答
1
投票

如果不是为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程序集相关的问题。分步说明:

  1. 从Visual Studio命令行运行sxstrace trace -logfile:mytrace.etl。在按ENTER键之前,该命令不会返回。但是,不要按ENTER键。
  2. 启动加载foo.dll的应用程序以重现您的问题
  3. 然后在“命令行”窗口中按Enter键以停止sxstrace
  4. 你现在有一个mytrace.etl文件,它不是人类可读的。通过运行sxstrace parse -logfile:mytrace.etl -outfile:mytrace.txt将其转换为可读格式。你得到一个文件mytrace.txt,它显示了当你加载foo.dll时它会发生什么,以及它无法解决它的某些依赖项。
© www.soinside.com 2019 - 2024. All rights reserved.