在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时遇到了问题,但是我无法找到任何指向我的方向。
答案 0 :(得分:2)
我的猜测是这个代码在WinForms应用程序中运行正常,你试过吗?
VB6和大多数设计用于VB6的COM组件都要求您在STA线程上运行才能正常工作。您的网络代码可能正在MTA主题上运行。答案 1 :(得分:1)
终于明白了。出于某种原因,.NET在运行时将属性解释为只读(对于C#和VB.NET以及Web和Windows),即使在设计时有get和set选项。 VB6将属性解释为get和在运行时和设计时设置,因此您可以想象我的困惑。我之前从来没有遇到过这样的事情。无论如何,我开始在第三方DLL周围放置一个VB6包装器,然后让.NET引用VB6包装器DLL。工作得很好并允许我继续开发,但仍然想要消除额外的VB6层。我们的一个COBOL开发人员最终能够模仿/重写传统的DLL。我讨厌像这样在废话上浪费时间,但我很高兴它已经完成了。
答案 2 :(得分:0)
如果@tcarvin是正确的,他可能是,你可以通过使用“AspCompat = true”页面指令强制ASP.net应用程序成为STA - msdn.microsoft.com/en-us/library/zwk9h2kb.aspx