0

CLR が有効になっている C++ DLL を利用する C++ ActiveX コントロールをホストする C# .Net 4.0 アプリケーションがあります。DLL には、OCX のパラメーターをロードする主な機能があり、この目的のために XML.Serializer を使用します。

このスタックは、すべてのコンポーネントが MS Visual Studio .Net 2003 でビルドされ、C# アプリケーションが .Net 1.1 で実行されている場合に正常に機能します。

ただし、モジュール全体が VS2010 に移行され、アプリケーションが .Net 4.0 に移行されると、コンテキストが一致しないため、恐ろしい Xml.Serializer の不正なキャスト例外が発生します。

例外は 4 行目で発生します。

FileStream* fs = __gcnew FileStream( filename, FileMode::Open );
XmlReader* reader = __gcnew XmlTextReader( fs );
XmlSerializer* serializer = __gcnew XmlSerializer( __typeof(MyClass) );
MyClass* obj = __try_cast<MyClass*>(serializer->Deserialize(reader)); 

例外ステートメントは次のとおりです。

[A]MyClass cannot be cast to [B]MyClass.
Type A originates from 'ParameterModule, Version=0.0.0.0, Culture=neutral,      PublicKeyToken=null' in the context 'Default'
at location 'C:\path\to\module\ParameterModule.dll'.
Type B originates from 'ParameterModule, Version=0.0.0.0, Culture=neutral,  PublicKeyToken=null' in the context 'LoadNeither'
at location 'C:\path\to\modu~\ParameterModule.dll'. 

ParameterModule.ParaClass.execute_DeSerialize() で例外がスローされました。

「LoadNeither」コンテキストには、チルダ(~) 文字を含むロケーション パスがあることに注意してください。「デフォルト」コンテキストにはフルパスがあります。

ActiveX コントロールの相互運用 DLL は、VS2010 によって自動的に生成されます。

何が例外の原因なのだろうか。Pathの不一致ですか?よくわかりませんが、DLL が 1 回だけ読み込まれたと思います。

それとも文脈の不一致ですか?コンテキストの不一致が原因である場合、C++ ActiveX コントロールのような相互運用モジュールの読み込みコンテキストを確認するにはどうすればよいでしょうか? または、Xml.Serializer を指定して、Serializing クラスを含む DLL を既定のコンテキストで読み込むことはできますか?

私はいたるところを見てきましたが、解決策を見つけることができませんでした。インターネットを調べれば調べるほど、これは私にとって謎になります。前もって感謝します。

4

2 に答える 2

0

奇妙なことに、static_cast を使用した場合、例外は発生しませんでした

MyClass* obj = static_cast<MyClass*>(serializer->Deserialize(reader)); 

この回答は、モジュールが 2 回読み込まれるという問題を実際に解決するものではありませんが、この回避策は誰かを助けるかもしれません。

于 2013-08-13T10:35:32.940 に答える