1

わかりました、これは私が頭を抱えているので、暗闇の中でのショットです。私は、VB6 でうまく機能するサードパーティの DLL を 2 つ持っていますが、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」行に「Member not found. (Exception from 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"));

前述のように、2 つの DLL (OAPPLICA.dll と OSESSION.dll) はサード パーティ製であり、サード パーティ製のレガシ システムへのエントリ ポイントを許可します。レガシーであるため、サードパーティにアクセスできなくなったため、既存の Windows VB6 アプリケーションを .NET Web アプリケーションに変換するプロトタイプを作成することを任されました。私の推測では、.NET が 2 つの COM オブジェクトの相互運用 DLL を解釈する際に問題が発生しているのですが、方向性を示すものを見つけることができませんでした。

4

3 に答える 3

2

私の推測では、このコードはWinFormsアプリで正常に実行されると思いますが、試してみましたか?

VB6、およびVB6で使用するために設計されたほとんどのCOMコンポーネントでは、正しく動作するためにSTAスレッドで実行する必要があります。WebコードはMTAスレッドで実行されている可能性があります。

于 2012-06-22T13:50:31.427 に答える
1

最後にそれを手に入れました。何らかの理由で、設計時に get および set オプションがあるにもかかわらず、.NET は実行時にプロパティを読み取り専用として解釈します (C# と VB.NET の両方、および Web と Windows の両方の場合)。VB6 は、実行時と設計時の両方でプロパティを get および set として解釈するため、私の混乱が想像できます。私はこれまでにこのようなものに出会ったことがありません。とにかく、サードパーティの DLL に VB6 ラッパーを配置することから始め、.NET に VB6 ラッパー DLL を参照させました。うまく機能し、開発を続けることができましたが、それでも余分な VB6 レイヤーを排除したいと考えていました。当社の COBOL 開発者の 1 人は、最終的にレガシー DLL を模倣/書き換えることができました。こんなくだらないことで時間を無駄にするのは嫌だけど、終わってよかった。

于 2012-09-23T13:16:00.990 に答える
0

@tcarvin が正しく、おそらく正しい場合は、"AspCompat=true" ページ ディレクティブを使用して、ASP.net アプリを強制的に STA にすることができます - msdn.microsoft.com/en-us/library/zwk9h2kb.aspx

于 2012-06-22T14:16:50.850 に答える