找不到互操作 DLL 返回成员



好吧,这是黑暗中的一枪,因为我已经到了智慧的尽头。 我有两个第三方 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 = "\devdata"
oApplication.WORKAREADRIVE = "\devdataworkarea"
oApplication.DATADRIVE = "\devdata"
oApplication.IMAGEDRIVE = "\devdataimage"
oSession.MYAPPLICATION = oApplication
vRetCode = oSession.LOGIN("USER1", "PASSWORD1") 'Returns zero if successful
MsgBox (vRetCode)

当我在 VB.NET 中运行这组完全相同的代码时,我得到"找不到成员。(HRESULT的例外:0x80020003(DISP_E_MEMBERNOTFOUND))"在"oSession.MYAPPLICATION = oApplication"行上。

我也尝试在 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时遇到问题,但是我找不到任何内容来指出我的方向。

我的猜测是此代码在 WinForms 应用程序中运行良好,您是否尝试过?

VB6

以及大多数设计用于 VB6 的 COM 组件将要求您在 STA 线程上运行才能正常工作。 您的 Web 代码可能在 MTA 线程上运行。

终于明白了。 出于某种原因,.NET 在运行时将这些属性解释为只读(对于 C# 和 VB.NET 以及 Web 和窗口),即使在设计时有 get 和 set 选项也是如此。 VB6 将属性解释为在运行时和设计时获取和设置,因此您可以想象我的困惑。 我以前从未遇到过这样的事情。 无论如何,我开始在第三方DLL周围放置一个VB6包装器,然后让.NET引用VB6包装器DLL。 工作得很好,允许我继续开发,但仍然想消除额外的 VB6 层。 我们的一位 COBOL 开发人员最终能够模仿/重写遗留的 DLL。 我讨厌在这样的废话上浪费时间,但我很高兴它已经完成了。

如果@tcarvin是正确的,而且他可能是,你可以通过使用"AspCompat=true"页面指令强制 ASP.net 应用程序是STA - msdn.microsoft.com/en-us/library/zwk9h2kb.aspx

最新更新