4

我有一个想在 Borland C++ 中使用的 C# 库。我采用的方法是使用混合模式 DLL,即使用 C++/CLI 作为 C# 库和 Borland C++ 之间的中间体。我创建了一个示例 HelloWorld 程序

C# 库:

namespace Hello
{
   class HelloWorld
   {
      public void Display();
      {
        Console.WriteLine("Hello World");
      }
   }
}

C++/CLI:

我创建了一个空的 VC++ 项目并将 C# 库添加为对 C++/CLI 项目的引用,该项目导出一个函数。我已将项目设置更改为使用 /clr,并将应用程序类型更改为 DLL。

测试.h

__declspec(dllexport) void DisplayHello();

测试.cpp

#include "Test.h"
using namespace Hello;

__declspec(dllexport) void DisplayHello()
{
   HelloWorld ^ mHello = gcnew HelloWorld();
   mHello->Display();
}

Borland C++:

我拿了 Visual Studio 生成的 DLL 并使用 Borland 提供的 IMPLIB 实用程序生成了一个 Borland C++ 编译器可以理解的 LIB 文件。

我使用生成的 lib 文件和头文件 Test.h 来构建 BCB 项目,我有一个调用 DisplayHello 的函数

void CallDisplay()
{
   DisplayHello();//Application crashes here.
}

我注意到的奇怪的事情是,当我删除

HelloWorld ^ mHello = gcnew HelloWorld();
mHello->Display();

该程序运行良好。

它抛出一个 EExternal 异常“e0434352”。我使用 HelloWorld 的方式似乎存在一些问题,我无法确定导致崩溃的原因,我们将不胜感激。

4

1 回答 1

2

错误代码 0xe0434352 是 CLR 异常。根据我的经验,当这些在启动时发生时,它们总是会成为定位程序集的问题。您可以启用程序集绑定日志,以帮助您找出无法加载的内容。无论如何,.NET 程序集应该在 .exe 目录中,或者在 GAC 中注册(如果在其他地方)。

如果加载程序集不是错误,则尝试附加 Windows 调试器 (windbg) 并使用它的托管调试来准确查看 .NET 异常是什么。

于 2013-02-20T15:49:41.953 回答