我还没有找到这种情况,并且很难找到解决方案。我有一个.Net应用程序试图动态加载托管C ++ DLL来执行应该返回Data.Model.Viper对象数组的任务。我也有我的.Net代码中定义的确切对象。因此,当我调用托管C ++方法时,我会获取我想要的数据,但是当我尝试使用它时,我不能将其称为Data.Model.Viper列表。由于它是动态加载的,我找不到别名的方法,即使我这样做,我也不确定是否可以将C ++ Data.Model.Viper列表转换为.Net Data.Model.Viper列表。
有人通过这样的方式工作吗?另类想法?
答案 0 :(得分:2)
这不起作用,.NET中的类型标识可以防止这种情况发生。一个强大的DLL地狱对策。类型的类型标识不仅仅是其命名空间名称和类型名称,还包括它来自的程序集。所以你有两个独特的Data.Model.Viper类型,它们根本没有任何关系。尝试强制转换只会产生InvalidCastException。
你必须使用一个公共类型,一个在主代码和C ++ / CLI程序集引用的单独程序集中声明的类型。
答案 1 :(得分:0)
当然,Hans Passant是对的。类不仅由其名称空间定义。您可以使用adapter设计模式。在.NET dll中,您可以创建一个适配器类来包装两个引用的类。然后你可以使用适配器类,在那里你将使用前两个类中的每一个。例如,您将创建ViperAdapter
类,它将替换.NET和C ++ Viper
类。
希望我帮忙!
答案 2 :(得分:0)
所以这不是“正确”的答案,Hans Passant的回答是更好的答案。然而,这就是我所做的,因为我们已经非常接近发布,并且需要花费更多的精力来使所有组件使用相同的模型。我只是xml序列化了我从托管C ++ DLL获得的结果,然后将其反序列化为Data.Model.Viper列表。这花费的时间不到1秒,并且该方法不会被大量调用,因此我认为性能问题的风险应该很小。