加载库 193

2023-12-20

我正在创建一个 C++/CLI dll,它将加载到旧版 C++ 应用程序中。遗留应用程序通过传统的 LoadLibrary 调用来完成此操作。应用程序和 C++/CLI dll 均以 64 位模式编译。

当发生 LoadLibrary 调用时,它会失败并显示错误 193。这通常意味着某些非 64 位组件正在尝试加载。当我查看 Visual Studio 2010 中的 dll 加载输出时,我发现加载 mscoree.dll 时发生故障(确切地说,我看到加载了我的 dll,然后加载了 mscoree,然后卸载了 mscoree,然后卸载了我的 dll) ,然后返回错误)。具体来说,C:\Windows\System32\mscoree.dll 正在被加载,当我检查这个 mscoree.dll 时,我发现它的目标是 I386。

如何确保我的应用程序链接到正确的 mscoree.dll?我知道这可以通过清单来完成,但我找不到任何有关设置清单的好信息。理想的解决方案将允许在 32 位或 64 位模式下进行编译并以正确的 mscoree.dll 为目标。

附带说明一下,我在并排文件夹中发现了一个 mscoree.dll,我验证该文件夹是 64 位模式,并将其复制到我的应用程序目录中,希望它能首先找到该文件。这不起作用,C:\Windows\System32 版本仍然加载。

Thanks,

Max

C++/CLI dll 上 CorFlags.exe 的输出

Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32+
CorFlags  : 16
ILONLY    : 0
32BIT     : 0
Signed    : 0

C:\System32\mscoree.dll 上 pedump.exe 的输出

PS C:\Windows\System32> pedump.exe .\mscoree.dll
Dump of file .\MSCOREE.DLL

File Header
  Machine:                      014C (I386)
  Number of Sections:           0004
  TimeDateStamp:                4B90752B -> Thu Mar 04 22:06:19 2010
  PointerToSymbolTable:         00000000
  NumberOfSymbols:              00000000
  SizeOfOptionalHeader:         00E0
  Characteristics:              2102
    EXECUTABLE_IMAGE
    32BIT_MACHINE
    DLL
...

(pedump 从这里继续描述导入和导出,但这在这里并不重要)

扩展加载信息

这是失败加载的完整输出。

注意:C++/CLI dll 称为 DsfClr.dll
输出是通过运行 gflags.exe -i [exename] +sls 并在调试器中检查结果获得的

http://pastebin.com/FyumUiMN http://pastebin.com/FyumUiMN

UPDATE:

使用 Reuben 在下面的评论中发布的提示,我能够确定 mscoree.dll 确实针对 AMD64,但 pedump 提供了无效信息,因为它在 WOW64 中运行。话虽这么说,我仍然无法加载这个库,如果有人有任何建议,他们将不胜感激。
我还尝试过一件事:我创建了一个新的 C# 应用程序并引用了 C++/CLI dll,然后在 main() 函数中,我在 C++/CLI dll 中实例化了一个类。这会在调用 main() 函数之前导致访问冲突异常。当我删除实例化时,主函数运行正常。我的猜测是,实例化导致了 C++/CLI 程序集的延迟加载,这导致了我在本机程序集中看到的相同加载错误。


如果有人遇到这个错误,事实证明它是由我的本机库使用 boost::threading 引起的。 boost::threading 库使用了一些奇怪的编译设置。结果是生成与 clr 或混合模式二进制文件不兼容的静态库。当然,Visual Studio对此一无所知,因此它很乐意将boost链接进来,并在加载dll时崩溃。
解决方案是在 boost::threading 中动态链接。最简单的方法是在项目设置中定义 BOOST_THREAD_DYN_LINK。一旦我定义了它,dll 就可以正常加载了。
在 google 上快速搜索 C++/CLI boost threading 将提供有关此错误的更多信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加载库 193 的相关文章

随机推荐

  • JavaScript:使用变量访问对象多级属性[重复]

    这个问题在这里已经有答案了 如果我使用变量作为键 如何访问多级属性 这是行不通的 var obj first thirst yo second beckon dud var key first thirst var result obj k
  • 如何在 UIWebView 中定义链接文本颜色

    我有一个短纯文本字符串 可能包含网络链接 我使用 loadHTMLString 将其加载到 UIWebView 中 并注意到例如字体样式和大小错误 找不到其他东西 所以我用 CSS 将文本嵌入到临时 HTML 文档中 这真的是唯一的方法吗
  • 防止用户找到已阻止他们的用户 Firebase

    在我的应用程序中 我不希望已被其他用户阻止的用户找到此类用户 假设用户 1 屏蔽了用户 2 当 user2 然后搜索应用程序内的所有用户时 我希望 user2 找到除 user1 之外的所有用户 因为 user1 已阻止 user2 就像
  • 过滤字典以仅包含某些键?

    我有一个dict有一大堆条目 我只对其中的少数几个感兴趣 有没有一种简单的方法可以删除所有其他的 构造一个新的字典 dict you want key old dict key for key in your keys 使用字典理解 如果您
  • 我可以在改造方法声明中使用可变参数吗?

    我有一个 API 端点 定义为 GET https api server com something id or ids where ids可以是一个单个对象 IDor以逗号分隔的 ID 列表 e g https api server co
  • uint 数据类型的 ODP .NET 参数问题

    从本机 NET oracle 数据提供程序更新到 Oracle ODP NET 后 我遇到了以下问题 我有一个存储过程 它是包的一部分 它接受 32 个参数 除了一个指定为 OUT 参数之外 全部为 IN 参数 无论如何 这是我遇到的问题
  • Android Gcm 接收器/Gcm 侦听器服务在接收时强制应用程序到前台

    我在 Android 最低 SDK 15 上实现 GCM 时遇到了问题 我完全能够接收来自 GCM 的推送通知 并且我的GcmListenerService实施已发挥作用onMessageReceived 打回来 但我的问题是 每当一个或另
  • 如何在 Spring IoC XML 配置中从 web.xml 获取显示名称

    准确地说 我怎样才能得到的值
  • 我可以将 UIToolbar 项目居中吗?

    我正在 UIToolbar 上放置一个标签 根据此提示 将 UILabel 添加到 UIToolbar https stackoverflow com questions 333441 adding a uilabel to a uitoo
  • 使用 ACCOUNT_FORMS 覆盖 Django allauth 登录表单

    我已经用简单的设置变量覆盖了注册表单ACCOUNT SIGNUP FORM CLASS但要覆盖您需要使用的登录表单ACCOUNT FORMS login yourapp forms LoginForm 我有我想要的表单 并且它可以通过 Cr
  • Java对象的内存分配过程的步骤

    当一个类实例化以下对象时 内存中会发生什么 public class SomeObject private String strSomeProperty public SomeObject String strSomeProperty th
  • 如何区分USB设备类型?

    读完后这个问题 https stackoverflow com questions 68749 working with usb devices in net关于使用 USB 设备 我想知道操作系统使用什么方法来区分 USB 设备类型 例如
  • 重新映射键的热键不会触发热字符串

    我有一个热键和热字符串似乎不能一起工作 9 ob0 left 1 为了提供一些上下文 在代码的一部分中 我将所有符号重新映射到它们下面的数字 反之亦然 所以9打印括号 后来 我放置了一个热字符串 该热字符串将在左括号后键入右括号 然后将光标
  • 如何制作具有最小高度的可扩展div

    如果我有一个高度 100 和宽度 100 的div 它的背景颜色将主要取决于浏览器的高度和宽度 但是 如果该 div 内的内容动态增长 则该 div 将不会根据内容扩展 文本将重叠并流过该 div 另一方面 如果我将 min height
  • 将“任何 CPU/首选 32 位”设为 VS 中的默认构建设置背后的基本原理

    假设在 x64 Windows 机器上使用最新版本的 Visual Studio 和 C 并分配大量数据 果然 当使用默认构建设置进行编译时 如下图所示为 VS 2019 Preview 2 1 当进程达到 4 GB 时 您将耗尽用户虚拟地
  • 多线程性能超越核心

    如果我有一个启动的进程X线程数量 是否会有性能增益X高于数量CPU核心 假设所有线程都同步工作 没有对存储 网络的异步调用 例如 如果我有两个核心CPU 我会减慢应用程序启动 3 个以上持续工作线程的速度吗 这实际上取决于您的代码的作用 它
  • gitignore 不忽略文件夹

    在我的项目的根目录中我有一个foo文件夹 在 的里面foo文件夹我有一个bar文件夹 我想忽略对我的内部所有文件的所有更改bar文件夹 我的里面有这个gitignore foo bar 检查该文件夹 它存在并且包含要忽略的文件 gitign
  • 此版本的 Microsoft.AspNetCore.All 仅与 netcoreapp2.1 目标框架兼容

    当我从 2 0 升级到 NET Core 2 1 后尝试将应用程序发布到 Web 服务器时 收到以下消息 此版本的 Microsoft AspNetCore All 仅与 netcoreapp2 1 目标框架兼容 请以 netcoreapp
  • 在 DOM 元素上调用自定义方法

    我想在 DOM 元素上调用自定义方法 像这样 div div 我该如何开发这个问题 是否有必要使用jQuery 您不需要使用 jQuery 您可以使用document getElementById MyObject 获取 DOM 节点的引用
  • 加载库 193

    我正在创建一个 C CLI dll 它将加载到旧版 C 应用程序中 遗留应用程序通过传统的 LoadLibrary 调用来完成此操作 应用程序和 C CLI dll 均以 64 位模式编译 当发生 LoadLibrary 调用时 它会失败并