代码之家  ›  专栏  ›  技术社区  ›  pgb

两个程序集中同名的类(有意)

  •  33
  • pgb  · 技术社区  · 16 年前

    我正在迁移一个用C++编写的库,并有一个C语言包装器。包装纸( LibWrapper )具有一组具有命名空间的类,例如:

    namespace MyNamespace
       class MyClass
       class MyOtherClass
    

    我的新图书馆, LibraryCS 包含与相同的命名空间和类名 李布拉斯 (根据用户要求),因此我也有:

    命名空间MyNamespace
    类Myclass
    肌热分级
    

    现在迁移已经完成,我正在创建一个测试来比较使用两个库的结果,以验证迁移。但是,当我试图引用 MyNamespace.MyClass 我得到一个编译器错误(预期的!)这表示“mynamespace.myclass在libwrapper和librarycs中都有定义”。

    对于这个问题,有没有什么诀窍可以让我使用两个具有完全相同名称但来自同一客户机代码中不同程序集的类?

    或者,是否有其他方法来测试这一点?

    将迁移的命名空间重命名为 MyNamespace2 当然可以,但是我们被要求不要这样做,为了让客户机代码更容易迁移。

    4 回复  |  直到 9 年前
        1
  •  58
  •   Quartermeister    16 年前

    你可以使用 extern alias 引用来自不同程序集的具有相同完全限定名的类型。选择对库的引用,并在“属性”页中将别名从“全局”更新为“库”,然后添加 extern alias LibraryCS; 到源文件的顶部,然后可以使用 LibraryCS::MyNamespace.MyClass 参考图书馆的课程。你可以使用 MyNamespace.MyClass global::MyNamespace.MyClass 引用libwrapper中的类,或者也可以使用别名来引用该类。

        2
  •  4
  •   Reed Copsey    16 年前

    为了在同一个可执行文件中加载这两个类,可以在单独的应用程序域中加载它们。这将允许您测试程序集,然后完全卸载它并加载第二个程序集并测试它。

    有关如何执行此操作的详细信息,请参阅 How to: Load Assemblies into an Application Domain Unload an Application Domain .

        3
  •  3
  •   Sin    9 年前

    看到了这个问题和答案,它帮助了我。对于那些需要详细解释的人来说,我发现 link 这真的很有用。

    从链接中提取。

    在一个应用程序中使用同一个dll的不同版本

    步骤1:使用 VS IDE . 在客户端应用程序解决方案中添加对这两个DLL的引用。然后在解决方案资源管理器的“引用”节点下,选择第一个(旧版本)类库。在属性窗口中,更改别名字段 全球的 奥尔德 . 莉莉, 纽弗 为了N 水壶版本 .

    步骤2:使用下面的代码作为第一个要引用它的语句

    extern alias oldVer;
    extern alias newVer;
    

    现在使用,

    Console.WriteLine(oldVer::MyLibrary.MyClass.method());
    Console.WriteLine(newVer::MyLibrary.MyClass.method());
    

    希望这有帮助。

        4
  •  0
  •   Shea    16 年前

    您可以在运行时加载第一个程序集,然后使用反射来实例化它并执行它的方法。然后卸载该程序集,加载第二个程序集,并使用反射创建该程序集并运行其方法。

    使用两个独立的进程然后比较结果输出可能会更容易些…

    推荐文章