C# 如何处理对具有相同导出的程序集的两个引用?

C# 如何处理对具有相同导出的程序集的两个引用?,c#,unit-testing,datacontractserializer,C#,Unit Testing,Datacontractserializer,我刚刚了解到通过DataContract支持序列化中的往返。因为我确信我会在这个机制上犯错误,所以我想在VisualStudio中建立一个单元测试来测试我的文件的新版本是否正常 为了实现这一点,我想 在单元测试中创建最新版本的文档对象 然后将该对象序列化为MemoryStream 使用我的应用程序的旧版本反序列化此对象 将此旧对象序列化到MemoryStream 使用当前版本反序列化此对象 检查第一个对象和最后一个对象的属性是否相同 这听起来很简单(或者可能不是?),我的问题是现在的单元测试需要

我刚刚了解到通过DataContract支持序列化中的往返。因为我确信我会在这个机制上犯错误,所以我想在VisualStudio中建立一个单元测试来测试我的文件的新版本是否正常

为了实现这一点,我想

  • 在单元测试中创建最新版本的文档对象
  • 然后将该对象序列化为MemoryStream
  • 使用我的应用程序的旧版本反序列化此对象
  • 将此旧对象序列化到MemoryStream
  • 使用当前版本反序列化此对象
  • 检查第一个对象和最后一个对象的属性是否相同
  • 这听起来很简单(或者可能不是?),我的问题是现在的单元测试需要同时引用我的应用程序的当前版本和旧版本

    所以如果我现在尝试创建这个对象,我会得到一个错误,说这个类型是在两个程序集中定义的

    所以我的问题是,如何处理对具有相同导出的程序集的两个引用

    我能做点像这样的事吗

    OldAssembly.MyClass old;
    CurrentAssembly.MyClass new;
    
    可以为每个引用的程序集声明一个。此别名通常是
    global
    ,但您可以将自己的别名声明为编译器的命令行参数,也可以在visual studio中的referenceAssemlys/{MyAssemly}/Properties/alias下声明

    在您的程序中,您可以使用

    old::My.NameSpace.MyClass old;
    global::My.NameSpace.MyClass new;
    

    可能,对于每个版本,您都可以将对象序列化为一个或多个文件(XML用于XmlSerializer或binary data用于BinarySerializer),然后可以使用类的新版本测试将这些文件反序列化为对象?你只需要将旧版本序列化一次,然后测试反序列化到新版本中,我想。我还记得关于一个类似主题的一个非常好的问题:你应该将这个问题的标题更改为类似于“如何处理对具有相同导出的程序集的两个引用”。@dash:no,我不能只使用旧文件,因为我想检查往返。我想在当前对象中设置新属性,并确保,如果旧版本加载并保存这些对象,新属性仍将被设置。我认为这是正确的,但现在我得到“错误CS1704:具有相同简单名称的程序集…已导入”。为了消除此错误,我对两个程序集进行了签名。现在,我通过添加“extern Alias old;”解决了“警告MSB3243:无法解决冲突”和“错误CS0432:未找到别名“old”的CS0432”。但我一直得到MSB3243和MSB3247。由于System.IO.FileLoadException抱怨找不到旧程序集,测试无法启动。两个程序集的文件名是否不同?这两个程序集都复制到exe outputdir了吗?是的,它们有不同的文件名,事实上我在资源管理器中重命名了旧程序集。不,旧的assambly没有复制到输出,我不知道为什么。我手动将此文件复制到输出。
    old::My.NameSpace.MyClass old;
    global::My.NameSpace.MyClass new;