gpt4 book ai didi

c# - C# .Net 4.0 应用程序中托管的 C++ ActiveX 控件中的 Xml.Serializer 非法转换异常

转载 作者:行者123 更新时间:2023-11-28 07:28:48 25 4
gpt4 key购买 nike

我有一个 C# .Net 4.0 应用程序托管一个 C++ ActiveX 控件,该控件使用启用了 CLR 的 C++ DLL。 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控件这样的Interop模块的加载上下文?或者,我们可以指定 Xml.Serializer 在默认上下文中加载包含序列化类的 DLL 吗?

我找遍了所有地方,但找不到解决方案。我在网上越梳理,这对我来说越是成谜。提前致谢。

最佳答案

but I think the DLL was loaded only once

不,它加载了两次。这就是问题所在,.NET 类型的标识不仅仅是命名空间 + 类型名称,它还包括从中加载它的程序集。这是一个 DLL hell 对策,它确保您不能从具有冲突定义的不同 DLL 中多次加载相同类型。

“LoadNeither”上下文是您的问题的线索。您以某种不寻常的方式加载了这个程序集。这样做的常用方法是使用 Assembly.LoadFile(),这是一种非常危险的方法,只能在您有意不希望类型匹配的非常特殊的情况下使用。您应该始终改用 LoadFrom(),但尽可能使用 Load()。你通常可以通过将 DLL 放在正确的目录中或使用 <probing> app.exe.config 文件中的元素。

获取版本 0.0.0.0 也不是很健康,顺便说一下,[AssemblyVersion] 在 .NET 中是一个非常重要的问题。

关于c# - C# .Net 4.0 应用程序中托管的 C++ ActiveX 控件中的 Xml.Serializer 非法转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com