C# 测试.NET中DLL之间的兼容性

C# 测试.NET中DLL之间的兼容性,c#,.net,visual-studio,dll,assemblies,C#,.net,Visual Studio,Dll,Assemblies,我正在使用VisualStudio2010和WinForms.NET4.0(C#)。我正在用大量的DLL(150)构建一个应用程序。当我向我的客户提供应用程序时,它是: 可执行文件(.exe) Dll文件(.Dll) 每个Dll都与应用程序的一个模块相关,例如: Ado.dll(提供对数据库的访问) ACCESMANAGENT.dll(此模块允许管理应用程序中的用户) Import.dll(此模块允许用户将数据导入应用程序) 等等 当我的客户机在应用程序中发现错误时,我会纠正它,并向他提供受

我正在使用VisualStudio2010和WinForms.NET4.0(C#)。我正在用大量的DLL(150)构建一个应用程序。当我向我的客户提供应用程序时,它是:

  • 可执行文件(.exe)
  • Dll文件(.Dll)
  • 每个Dll都与应用程序的一个模块相关,例如:

    • Ado.dll(提供对数据库的访问)
    • ACCESMANAGENT.dll(此模块允许管理应用程序中的用户)
    • Import.dll(此模块允许用户将数据导入应用程序)
    • 等等
    当我的客户机在应用程序中发现错误时,我会纠正它,并向他提供受影响的DLL(以避免他测试所有应用程序)。例如,它可以是导入Dll

    问题是,在一些交付之后,我们可能会遇到Dll之间的兼容性问题(例如,新Dll中不再存在的方法)。为了避免这个问题,我想找到一个能够检查不同DLL之间兼容性的工具

    我想要一些像:

  • 我指定要分析的程序目录(可执行文件+Dll)
  • 我开始分析
  • 例如,程序告诉我:Import.dll和Ado.dll之间存在错误,Import.dll中有一个类xxx,在Ado.dll的类xxx中需要一个名为xxx的方法

  • 我发现一些工具能够比较Dll的两个版本,并提供添加和删除的成员(Libcheck、ApiChange),但这对我来说太复杂了,因为有太多的更改。

    我认为您可能在这里遇到了配置管理问题——至少和您遇到的“兼容性”问题一样多

    我建议您找到一种方法来跟踪每个客户正在使用的程序集的版本,以便(1)在您决定发布什么时您知道他们在使用什么,以及(2)当他们报告错误时,您可以复制他们的设置(从而复制他们的错误)。如果这听起来像是一个很大的工作,它是。这就是为什么许多软件开发公司采取措施来确保客户之间的设置变化有一个限度。几乎可以肯定的是,每个客户的最终结果都会有所不同,但您所能做的任何处理该问题的工作都将是有益的


    除了流程含义之外,如果您真的需要创建一个“可插拔”环境,那么您可能需要为您的对象创建一些接口来控制它们连接的点,您可能应该看看Microsoft(MEF)。MEF可以帮助您管理对象从其他对象“需求”行为的方式。

    我认为您可能存在配置管理问题——至少与您遇到的“兼容性”问题一样多

    我建议您找到一种方法来跟踪每个客户正在使用的程序集的版本,以便(1)在您决定发布什么时您知道他们在使用什么,以及(2)当他们报告错误时,您可以复制他们的设置(从而复制他们的错误)。如果这听起来像是一个很大的工作,它是。这就是为什么许多软件开发公司采取措施来确保客户之间的设置变化有一个限度。几乎可以肯定的是,每个客户的最终结果都会有所不同,但您所能做的任何处理该问题的工作都将是有益的


    除了流程含义之外,如果您真的需要创建一个“可插拔”环境,那么您可能需要为您的对象创建一些接口来控制它们连接的点,您可能应该看看Microsoft(MEF)。MEF可以帮助您管理对象从其他对象“需求”行为的方式。

    我终于找到了解决问题的方法

    因为我是:

    • 在我正在构建的应用程序版本中使用SourceSafe并添加标签
    • 用应用程序的版本标记我的每个DLL
    我建立了一个能够:

    • 打开文件夹的每个Dll以读取其中应用程序的版本
    • 从SourceSafe获取DLL中指定版本的每个项目(功能性为“获取标签”)
    然后我只需要建立项目。如果存在任何编译错误,则存在兼容性问题


    这个解决方案可以避免大的兼容性问题,但您仍然可以遇到编译无法看到的兼容性问题…

    我终于找到了解决问题的方法

    因为我是:

    • 在我正在构建的应用程序版本中使用SourceSafe并添加标签
    • 用应用程序的版本标记我的每个DLL
    我建立了一个能够:

    • 打开文件夹的每个Dll以读取其中应用程序的版本
    • 从SourceSafe获取DLL中指定版本的每个项目(功能性为“获取标签”)
    然后我只需要建立项目。如果存在任何编译错误,则存在兼容性问题


    此解决方案可以避免大的兼容性问题,但您仍然可能会遇到编译时无法看到的兼容性问题…

    您实际上是在寻找依赖项分析工具。我建议您在将修改后的程序集发送给客户端之前对某些程序集进行更改时,对应用程序进行更彻底的测试。您所描述的不是接口吗?您应该依赖于接口,而不是具体的实现。我不知道有什么工具可以测试这些,但是了解哪些更改可以做,哪些更改不能做应该可以帮助您避免将来出现此类问题。我使用的是.NET依赖项查看器。您实际上是在寻找依赖项分析工具。我建议您在发送这些修改后的应用程序之前对某些程序集进行更改时,对应用程序进行更彻底的测试