【问题标题】:Issues in .Net interoperability with Borland C++.Net 与 Borland C++ 的互操作性问题
【发布时间】:2012-10-09 06:33:41
【问题描述】:

我有一个 C# 库,我想在 Borland 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();

Test.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 的方式似乎存在一些问题,我无法确定导致崩溃的原因,我们将不胜感激。

【问题讨论】:

    标签: c# interop c++-cli c++builder


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多