【问题标题】:C# exception thrown from a C++ managed dll - EEFileLoadException * __ptr64从 C++ 托管 dll 引发的 C# 异常 - EEFileLoadException * __ptr64
【发布时间】:2012-07-20 18:02:20
【问题描述】:

我从一个普通的 C# 控制台程序中收到此错误,该程序正在使用作为 C++ CLI 项目的构建输出生成的 DLL。我有一个简单的DumbThingpublic ref class 和一个静态方法。我想简单地调用该函数或至少实例化一个微小的 DumbThing 对象,并看到 C# 可以调用它从 C++ CLI 生成的 DLL 获取的代码,但它不起作用,因为它引发了一个让我更加困惑的错误:

First-chance exception at 0x000007fefd2acacd (KernelBase.dll) in DumbTest.exe: Microsoft C++ exception: EEFileLoadException * __ptr64 at memory location 0x007fc228..

更新:在原始异常下方,还有另一个第一次机会异常:

First-chance exception at 0x77cace3b (ntdll.dll) in DumbTest.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.

一位同事向我指出这可能是编译时问题(某些选项),但我没有任何线索可能导致它。谁能提供一些起点提示?

【问题讨论】:

  • 您的 C# 项目是否设置为专门针对 64 位进行编译(并不总是一件好事)?项目 --> 属性 --> 构建 --> 平台目标。如果未设置,请尝试将其设置为 x86。
  • 第一次机会异常是运行时的事情。您是否能够在 Main 开头的 C# 代码中放置一个断点并在此异常之前到达该断点?这将澄清这是否是加载程序问题。
  • 不,在主函数中任何提及哑类都会抛出这个异常,忽略任何断点。那一定是负载问题..但我不知道是什么原因造成的..也许C++生成的dll需要其他程序集? (它在其驻留文件夹中包含所有内容,并且遍历其依赖项不会显示任何肮脏)..

标签: c# c++-cli 64-bit managed dll


【解决方案1】:

这可能是位问题。如果您为特定平台编译了 C++/CLI 项目,请确保您的 C# 项目已相应地设置其平台。 C# 项目的默认值为“Any CPU”,这会导致 JIT 编译器在 64 位架构上生成 x64 代码。如果您的 C++/CLI 项目是为 x86 构建的,则无法将其加载到 64 位机器上的 x64 进程中。

【讨论】:

  • 感谢提示,我仔细检查了一下,dll是64位的,c#应用平台也是64位的,进程是64位的。同样的结果,保存另一个我忘记提及的第一次机会例外。因此,我更新了问题。
  • 确保您的项目以及您的第 3 方依赖项都是 64 位的。刚刚遇到这个问题 - 我们的 64 位软件引用了 x86 版本的 SlimDX,编译良好,但在运行时崩溃。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多