【问题标题】:Application unable to load Win32 assembly from WinSxS应用程序无法从 WinSxS 加载 Win32 程序集
【发布时间】:2014-08-14 06:11:05
【问题描述】:

我有一个 Win32 程序集(我的 .NET 代码上的 C++/CLI 包装器),它应该安装在 WinSxS 中,并且应该由使用 API 的客户端应用程序从该位置引用。我对如何在 WinSxS 中安装 Win32 程序集进行了一些研究,最终能够通过使用 mainfest 和目录文件来完成它。

现在的问题是我无法使用我为测试目的创建的控制台应用程序中的程序集。我在 exe 清单中添加了 <dependency> 部分以引用程序集(如下所示),但它不起作用。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity name="MyAssembly" processorArchitecture="x86" publicKeyToken="10f783dc6145a3s0" type="win32" version="1.0.0.58">
      </assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

exe 失败并显示错误消息:程序无法启动,因为您的计算机中缺少 MyAssembly.dll。尝试重新安装程序来解决这个问题。

在检查 Procmon 时,似乎 exe 仅在 exe 位置和 Path 环境变量中指定的所有位置中搜索 dll。当我将 dll 的 WinSxS 位置放在 Path 变量中并执行应用程序时,它工作正常。我想知道在生成导致问题的 exe 清单时是否缺少任何其他项目设置。想法?

【问题讨论】:

  • 您是否有特定原因要使用 WinSxS?甚至微软也不再使用这一点,最新的 C++ 运行时不再使用 WinSxS。
  • 这是这里的标准,我只能这么说。无论如何,我注意到将 Embed Manifest 设置设置为 True 并在 Additional Manifest Dependencies 中提供 assemblyIdentity 参数解决了这个问题。当然,我仍然需要看看为什么外部清单不起作用。
  • 敲响了警钟,我不能说我曾经得到过外部清单来做我想做的事 - 最终只是放弃并使用了内部清单。

标签: c++ winapi dll exe winsxs


【解决方案1】:

问题原来是 UAC 项目设置。将 UAC 属性设置为 No 解决了该问题,应用程序现在能够加载程序集,而无需使用诸如添加到 PATH 变量之类的变通方法。

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多