1

ウェブで見つけることができるガイドに従って、foxpro (9 with SP) 用の .net (3.5) COM コントロールを作成しました (たとえば、rick strahls weblog から)。

現在、時々 foxpro で、オブジェクトを解放するときに C000005 が発生します。

そこで、このシナリオを再現しようとしました。オブジェクトを何百回もインスタンス化して解放すると、同じエラーが発生しました。

空の FoxPro SCX フォームと、コードのない単純な .net ボタンを使用します。

.net オブジェクトを破棄しないと、同様の .net 例外「保護されたメモリの読み取りまたは書き込みを試みました」が発生します。

".(完全な例外は下部を参照)

ここに VFP コード:

Local lnAnzahl as Number, ;
 lni as Number

set procedure to DummyProcedure.prg

lnAnzahl = val(inputbox("wie oft", "oft","0"))

for lni = 1 to lnAnzahl
 thisform.newobject("cntTest","netcontrol","c0005nativetest.vcx")
 thisform.RemoveObject("cntTest")     
endfor

.net エラー メッセージ

System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen or zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist. System.Runtime.InteropServices.ComTypes.IAdviseSink.OnViewChange(Int32 アスペクト、Int32 インデックス) System.Windows.Forms.Control.ActiveXImpl.ViewChanged() System.Windows.Forms.Control.ActiveXImpl.ViewChangedInternal() System. Windows.Forms.Control.OnInvalidated(InvalidateEventArgs e)
System.Windows.Forms.Control.NotifyInvalidate(Rectangle invalidatedArea) System.Windows.Forms.Control.Invalidate(Boolean invalidateChildren)
System.Windows.Forms.Control.WmUpdateUIState(Message& m) System.Windows.Forms.Control.WndProc(Message& m) System.Windows.Forms.ScrollableControl.WndProc(Message& m) System.Windows.Forms.ContainerControl .WndProc(Message& m) System.Windows.Forms.UserControl.WndProc(Message& m) System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) System.Windows.Forms.Control.ActiveXImpl.System.Windows .Forms.IWindowTarget.OnMessage(Message& m) System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

これは既知の問題ですか? どうすれば解決できるかアドバイスはありますか?

4

1 に答える 1

1

実稼働環境でこのエラーが発生しました。

.NET COM コンポーネントを VFP 環境から完全に解放することは明らかに不可能です。.NET COM コンポーネントは、アプリケーションが終了するまでメモリに保持されます。

Rick Strahl は、ここで遭遇した問題に対して非常に洗練された解決策を示しています。

Visual FoxPro で NET ランタイムをホストする

...この問題について議論している他の投稿へのリンクは以下のとおりです。

.NET ランタイムは VFP に固定されます。一度 .NET COM コンポーネントをロードすると、このコンポーネントを完全にアンロードすることはできません。つまり、.NET COM の開発中は、Visual FoxPro をシャットダウンして .NET COM コンポーネントを再読み込みする必要があります。

.NET コンポーネントは、関連するリソースをアンロードしない場合があります。.NET ガベージ コレクターは、実行中の .NET インスタンス内のオブジェクトとオブジェクトの状態をクリーンアップします。これは、オブジェクトを削除すると、実際のオブジェクトとそれに関連するリソースがすぐにアンロードされる可能性があることを意味します。たとえば、関連付けられたメモリ バッファを持つ Bitmap オブジェクトをロードし、単に参照をクリアしても、関連付けられたメモリ バッファ データはすぐには解放されません。Dispose() メソッドを使用できる場合は、ここで関連リソースを明示的にアンロードするのに役立ちます。

すべての型が Visual FoxPro で機能するわけではありません: 一部のデータ型 (具体的には値型と一部の特殊なコレクション型) は、COM 経由でアクセスした場合に Visual FoxPro で機能しません。また、COM から Visual FoxPro に渡された一部の配列型は、変更できず、新しい要素または削除された要素と共に送り返すことができません。

通常、FoxPro から .NET に型を渡すことはタイプ セーフではありません。.NET に渡す VFP COM コンポーネントがない限り、Visual FoxPro で作成された厳密に型指定されたオブジェクトを .NET に簡単に渡すことはできません。FoxPro オブジェクトは汎用の「オブジェクト」参照として渡され、ほとんどの場合、Reflection を使用してアクセスする必要があります。

于 2015-01-09T16:57:38.637 に答える