1

我正在从 C++ 调用 .NET 程序集。

这对于我调用的任何测试 .NET 4.0 项目都非常有效。

但是,当调用具有 20 个子程序集的大型项目时,它会失败并出现以下错误:

Failed to execute assembly: 0x80004003. GetLastError=126. dwReturn=1.

这是生成错误的 C++ 代码:

DWORD dwReturn;
hr = pCLR->ExecuteInDefaultAppDomain(szApplication, szEntryType, szEntryMethod, szParameter, &dwReturn);
if (FAILED(hr))
{
    // Fails if I try the production assembly, with 20 subassemblies.
    printf("    Failed to execute assembly: 0x%X. GetLastError=%d. dwReturn=%d.\n", hr, GetLastError(), dwReturn);
}
else
{
    // Works 100% if I plug in a small toy assembly in .NET 4.0.
    wprintf(L"    Assembly returned: %d\n", dwReturn);
}

环境

  • 视觉工作室 2010 SP1。
  • 上面代码的 C++。
  • .NET 4.0 用于目标程序集。
4

1 回答 1

3

您的托管代码因 NullReferenceException 而死。它的 Exception.HResult 值为 0x80004003,E_POINTER。

显然,这是托管代码死亡的一个非常常见的原因。在从托管代码转换回本机代码的过程中,您将丢失大量异常上下文。这给托管代码带来了一些负担,需要进行一些基本的错误日志记录,至少是全能的 Exception.StackTrace。.NET 4 AppDomain.FirstChanceException 事件可能很有用。

通过启用托管代码调试、项目 + 属性、调试、调试器类型 = 混合来调试问题。并且 Debug + Exceptions, Thrown 复选框用于 CLR 异常,因此调试器会在抛出异常时停止程序。

于 2012-09-10T13:49:57.517 回答