使用C#中的复杂用户定义类型(UDT)调用VB6 DLL函数

All*_*ons 9 c# vb6 dll com-interop user-defined-types

我正在编写一个C#应用程序来调用第三方VB6 DLL.我在References-> COM选项卡中添加了对VB6 DLL的引用.

DLL中的特定方法采用VB6 UDT(用户定义类型)作为参数.

此UDT在COM的自动生成的.NET包装器中显示为结构.该结构具有许多子UDT /结构以及VBA.Collection类型的成员(如.NET元数据所示).它还有常规数据类型,如string,short,double,int等.

我在我的C#代码中初始化这个结构为:

udtEmployee udtEmpData = default(udtEmployee);
Run Code Online (Sandbox Code Playgroud)

我也试过了

udtEmpData = new udtEmployee();
Run Code Online (Sandbox Code Playgroud)

如果我没有使用default或new初始化它,我无法编译我的C#代码,因为编译器抱怨使用未分配的变量.

我需要传递这个结构作为参考.我是这样做的:

clsEmployee.SetData(ref udtEmpData);
Run Code Online (Sandbox Code Playgroud)

在调用VB6 DLL的这个方法时,我收到错误:

错误:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

原因是什么,解决方案是什么?

注意,我无法更改VB6 DLL,因为我没有其源代码.我正在使用VS 2005.

编辑1:

这是一个完整的背景:

有一个本地开发的ERP产品,它支持使用VB6的附加开发.它有一个配置文件,它指定要加载的附加DLL的名称.然后,这些插件将显示在ERP应用程序的菜单中.在菜单上单击,ERP调用名为StartAddOn()的函数,该函数应存在于VB6 DLL中.

我想在C#中开发附加组件,所以我开发了一个带有StartAddOn方法的简单VB6插件,后者又将控制权传递给我的.NET DLL.

.NET DLL使用ERP公开的业务类,并来回传递数据对象.在.NET DLL中,我添加了对ERP供应商发布的DLL的COM引用.

所以架构是这样的:ERP-> VB6 AddOn和StartAddOn方法 - > .NET DLL->使用ERP供应商发布的COM DLL及其数据类(结构/ UDT).

如何调试内存错误?

Ste*_* CO 3

该结构是什么样的?我已经有一段时间没有进行任何认真的 VB6 开发了,但我记得在语言之间调用时有时让我绊倒的一件事是 VB6 坚持双字对齐它的所有结构。例如,如果中间混合了一些字节值,它将插入填充,以便所有值在偶数 4 字节边界上对齐。考虑以下:

Type MyType
    A As Long
    B As Byte
    C As Long
End Type
Run Code Online (Sandbox Code Playgroud)

在内存中,B 和 C 之间会有 3 个字节的未使用空间。当然,如果 C# 不执行相同的填充,它可能会导致您的值丢失并导致各种混乱。

对于某些编译器(例如 C),可以设置编译器开关以使用这种类型的对齐方式。不知道C#有没有类似的东西。如果不是,解决方案是将一些适当大小的虚拟字段插入到 C# 大小的结构中。

以下文章提供了有关 VB6 如何对齐 UDT 的更多信息: http://www.developerfusion.com/article/3367/copymemory-and-arrays-proper-use/4/