【发布时间】:2013-08-11 13:42:23
【问题描述】:
我有一个 C# .Net 4.0 应用程序,它使用启用了 CLR 的 C++ DLL 托管 C++ ActiveX 控件。 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 自动生成。
我想知道是什么导致了异常。 是路径不匹配吗?我不确定,但我认为 DLL 只加载了一次。
还是上下文不匹配? 如果是因为上下文不匹配,我们如何确保像 C++ ActiveX 控件这样的互操作模块的加载上下文? 或者,我们可以指定 Xml.Serializer 在默认上下文中加载包含序列化类的 DLL 吗?
我到处寻找,但找不到解决方案。我在互联网上梳理得越多,这对我来说就越是一个谜。提前致谢。
【问题讨论】:
标签: c# c++ activex interopservices