我正在编写一个C#应用程序,以调用第三方VB6 DLL。我已在“引用->COM”选项卡中添加了对VB6 DLL的引用。
DLL中的特定方法需要将VB6 UDT(用户定义类型)作为参数。
这个UDT在COM的自动生成的.NET封装器中显示为结构体。该结构体有许多子UDT / 结构体,以及类型为VBA.Collection的成员(由.NET元数据显示)。它还具有常规数据类型,如字符串,短整型,双精度浮点数,整型等。
我正在我的C#代码中初始化此结构体:
我也尝试过。
如果我不使用默认值或new来初始化它,我的C#代码将无法编译,因为编译器会抱怨使用未赋值的变量。
我需要将这个结构体作为引用传递。我是这样做的:
在调用VB6 DLL的此方法时,我遇到了错误:
注意,我无法更改VB6 DLL,因为我没有其源代码。我正在使用VS 2005。
编辑1:
完整背景如下:
有一款本地开发的ERP产品,支持使用VB6进行插件开发。它有一个配置文件,指定要加载的插件DLL的名称。然后在ERP应用程序中的菜单中显示这些插件。单击菜单时,ERP会调用名为StartAddOn()的函数,该函数应存在于VB6 DLL中。
我想用C#开发插件,因此我开发了一个简单的VB6插件,并带有StartAddOn方法,该方法再将控制传递给我的.NET DLL。
.NET DLL使用ERP公开的业务类,并传递数据对象。在.NET DLL中,我已经添加了对ERP供应商发布的DLL的COM引用。
因此,架构如下: ERP->具有StartAddOn方法的VB6 AddOn->.NET DLL->使用ERP供应商的COM DLL及其数据类(结构/UDT)。
如何调试内存错误?
DLL中的特定方法需要将VB6 UDT(用户定义类型)作为参数。
这个UDT在COM的自动生成的.NET封装器中显示为结构体。该结构体有许多子UDT / 结构体,以及类型为VBA.Collection的成员(由.NET元数据显示)。它还具有常规数据类型,如字符串,短整型,双精度浮点数,整型等。
我正在我的C#代码中初始化此结构体:
udtEmployee udtEmpData = default(udtEmployee);
我也尝试过。
udtEmpData = new udtEmployee();
如果我不使用默认值或new来初始化它,我的C#代码将无法编译,因为编译器会抱怨使用未赋值的变量。
我需要将这个结构体作为引用传递。我是这样做的:
clsEmployee.SetData(ref udtEmpData);
在调用VB6 DLL的此方法时,我遇到了错误:
原因是什么?解决方案是什么?错误:尝试读取或写入受保护的内存。这通常是其他内存损坏的指示。
注意,我无法更改VB6 DLL,因为我没有其源代码。我正在使用VS 2005。
编辑1:
完整背景如下:
有一款本地开发的ERP产品,支持使用VB6进行插件开发。它有一个配置文件,指定要加载的插件DLL的名称。然后在ERP应用程序中的菜单中显示这些插件。单击菜单时,ERP会调用名为StartAddOn()的函数,该函数应存在于VB6 DLL中。
我想用C#开发插件,因此我开发了一个简单的VB6插件,并带有StartAddOn方法,该方法再将控制传递给我的.NET DLL。
.NET DLL使用ERP公开的业务类,并传递数据对象。在.NET DLL中,我已经添加了对ERP供应商发布的DLL的COM引用。
因此,架构如下: ERP->具有StartAddOn方法的VB6 AddOn->.NET DLL->使用ERP供应商的COM DLL及其数据类(结构/UDT)。
如何调试内存错误?