我有一个旧的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的名字截然不同,但是很有效。
答案 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。