Borland Builder 2006在C#.Net中使用的DLL - System.StackOverflowException

时间:2012-01-23 09:25:49

标签: c# c++ pinvoke c++builder dllimport

我有一个旧的DLL(Borland Builder 2006 C ++),我想在.Net C#Visual Studio 2010中使用。当我尝试在VS中导入函数时,我总是从Visual Studio中获得StackOverflowException。我已经阅读了很多东西,导入似乎很容易。但我失败了,没有看到我的错误。

在Borland DLL中,函数导出为:

  • __declspec(dllexport) void TestFunc1()
  • extern "C" __declspec(dllexport) void __stdcall TestFunc2()

装饰的名称是(使用impdef创建的* .DEF文件,并使用依赖性walker进行了证明):

  • @TestFunc1$qqsv
  • TestFunc2

在Visual Studio中,我以这种方式导入:

[DllImport("MyDllName.dll", EntryPoint = "@TestFunc1$qqsv", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
public static extern void TestFunc1();

[DllImport("MyDllName.dll",CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
public static extern void TestFunc2();

在booth案例中,当我打电话时,从Visual Studio获取StackOverflowException:

  • MyImport_Unmanaged.TestFunc1()
  • MyImport_Unmanaged.TestFunc2()

有什么问题?有人能帮助我吗?

有趣的是,当我导入使用Visual Studio C ++创建的旧dll时,函数的修饰名称为:_TestFunc1@0。这个名字与Borland的名字截然不同,但是很有效。

3 个答案:

答案 0 :(得分:0)

正确的语法是: extern“C”void __ stdcall __declspec(dllexport)TestFunc1()

答案 1 :(得分:0)

我遇到了同样的问题。经过大量的实验,我意识到问题不是语法问题。事实上,C ++ Builder DLL正在使用VCL Forms。我删除了表格,一切正常。

答案 2 :(得分:0)

是的,Panos似乎是对的。我尝试用VCL调用旧的BCB5 DLL 首先看它工作得很好。但它默默地破坏了C#程序,稍后会出现奇怪的异常。 不使用Borland DLL中的VCL是使其工作的唯一方法。对我们来说,这意味着我们必须将我们的代码转换为完整的todo-list上的VisualStuidio。