【问题标题】:type exists in both dlls with dynamically loaded dll类型存在于动态加载的 dll 的两个 dll 中
【发布时间】:2013-12-12 18:30:37
【问题描述】:

我还没有找到这种情况,并且很难找到解决方案。我有一个 .Net 应用程序尝试动态加载托管 C++ dll 以执行应返回 Data.Model.Viper 对象数组的任务。我的 .Net 代码中也定义了那个确切的对象。因此,当我调用托管 C++ 方法时,我会取回我想要的数据,但是当我尝试使用它时,我无法将其称为 Data.Model.Viper 列表。由于它是动态加载的,我无法找到别名的方法,即使这样做我也不确定是否可以将 C++ Data.Model.Viper 列表转换为 .Net Data.Model.Viper 列表。

有人解决过这样的问题吗?其他想法?

【问题讨论】:

  • 你是说命名空间完全一样吗?
  • 是的,托管 C++ dll 使用从 .Net Web 服务生成的头文件,因此基本数据模型是精确副本。我现在需要在网站内使用这个托管的 C++ dll。
  • 你能把它包装到另一个程序集中,在不同的命名空间下暴露相同的类型,还是你可以改变你复制对象的命名空间?

标签: .net managed-c++


【解决方案1】:

这不起作用,.NET 中的类型标识阻止了这种情况。强大的 DLL 地狱对策。类型的类型标识不仅仅是它的命名空间名称和类型名称,还包括它来自的程序集。所以你有两个独特的 Data.Model.Viper 类型,它们之间根本没有任何关系。尝试强制转换只会产生 InvalidCastException。

必须使用一种通用类型,该类型在单独的程序集中声明,您的主代码和 C++/CLI 程序集都引用该程序集。

【讨论】:

    【解决方案2】:

    当然,Hans Passant 是对的。一个类不仅由其命名空间定义。您可以使用adapter 设计模式。在 .NET dll 中,您可以创建一个适配器类来包装两个引用的类。然后,您可以使用适配器类,您将使用前两个类中的每一个。例如,您将创建 ViperAdapter 类,它将替换 .NET 和 C++ Viper 类。

    希望我能帮上忙!

    【讨论】:

      【解决方案3】:

      所以这不是“正确”的答案,而 Hans Passant 的答案是更好的答案。然而,这就是我所做的,因为我们离发布如此之近,并且要让所有组件使用相同的模型需要付出更多的努力。我只是对从托管 C++ dll 获得的结果进行 xml 序列化,然后将其反序列化为 Data.Model.Viper 列表。这花费了不到 1 秒的时间,并且不会大量调用该方法,因此我认为性能问题的风险应该很小。

      【讨论】:

        猜你喜欢
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-05-16
        • 2013-01-20
        • 1970-01-01
        • 2010-09-30
        相关资源
        最近更新 更多