【发布时间】:2012-06-21 21:48:41
【问题描述】:
好的,这是在黑暗中拍摄的,因为我已经束手无策了。我有两个第三方 DLL,它们在 VB6 中运行良好,但在 VB.NET 或 C# 中运行不佳。
在 VB6 中,以下工作正常:
Dim oApplication As Object
Dim oSession As Object
Dim vRetCode As Variant
Set oApplication = CreateObject("OAPPLICA.OAPPLICA")
Set oSession = CreateObject("OSESSION.OSESSION")
oApplication.PROGRAMDRIVE = "\\dev\data\"
oApplication.WORKAREADRIVE = "\\dev\data\workarea\"
oApplication.DATADRIVE = "\\dev\data\"
oApplication.IMAGEDRIVE = "\\dev\data\image\"
oSession.MYAPPLICATION = oApplication
vRetCode = oSession.LOGIN("USER1", "PASSWORD1") 'Returns zero if successful
MsgBox (vRetCode)
当我在 VB.NET 中运行这组完全相同的代码时,我在“oSession.MYAPPLICATION = oApplication”行上得到“未找到成员。(HRESULT 异常:0x80020003 (DISP_E_MEMBERNOTFOUND))”。
我也尝试在 VB.NET 和 C# 中进行早期绑定,但最终在不同的行上出现相同的错误。我在“oApplication.set_PROGRAMDRIVE("\\dev\lifepro\data\");”上得到了相同的错误行。
private OAPPLICA.OAPPLICA oApplication = new OAPPLICA.OAPPLICA();
private OSESSION.OSESSION oSession = new OSESSION.OSESSION();
Int64 iReturnCode;
oApplication.set_PROGRAMDRIVE("\\\\dev\\data\\");
oApplication.set_WORKAREADRIVE("\\\\dev\\data\\workarea\\");
oApplication.set_DATADRIVE("\\\\dev\\data\\");
oApplication.set_IMAGEDRIVE("\\\\dev\\data\\image");
m_oSession.set_MYAPPLICATION(m_oApplication);
iReturnCode = Convert.ToInt64(m_oSession.LOGIN("USER1", "PASSWORD1"));
如前所述,这两个 DLL(OAPPLICA.dll 和 OSESSION.dll)是第三方的,允许进入第三方遗留系统的入口点。由于它是遗留的,我无法再访问第三方,我的任务是尝试将现有的 Windows VB6 应用程序原型转换为 .NET Web 应用程序。我的预感是 .NET 在解释两个 COM 对象的互操作 DLL 时遇到问题,但我一直无法找到任何可以为我指明方向的东西。
【问题讨论】:
-
您是如何将这两个 dll 添加到您的项目中的?右键单击,“添加引用”和“COM”选项卡?
-
这两个 DLL 完全按照您的描述添加。
-
方法
.set_Application是否出现在intellisense中,我问的原因是因为错误消息是Member Not Found...并且VB6代码不使用.set_Applicationmethod,它分配给 MYAPPLICATIONProperty。 -
是的,.set_Application 出现在智能感知中。最初的属性方法并没有像 VB6 中那样出现,因为我试图设置应用程序属性,所以我认为这就是互操作 DLL 解释该功能的方式。
-
@Chris,你有 .Net Reflector 吗?如果没有,请检查一下。 27.am/posts/how-to-download-net-reflector-6-for-free 。一旦你有了它,我们就可以查看互操作程序集,也许看看为什么找不到这些方法。