用于C#/ .NET API的向后兼容性的工具?

时间:2010-03-04 08:41:01

标签: c# .net api binary-compatibility

我找到了这个工具http://sab39.netreach.com/Software/Japitools/JDK-Results/46/,它使用javadoc检查不同版本的Java for Java之间的向后兼容性。

是否有一个与C#/ .NET相当的工具?

以下是使用此工具对JDK 1.5和JDK 6 API进行比较的示例: http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-jdk6

3 个答案:

答案 0 :(得分:17)

  • ApiChange确实采用了一组“旧”程序集和一组“新”程序集,这些程序集可能会破坏Api更改:

      

    ApiChange -diff -old HelloWorldV1.dll -new HelloWorldV2.dll

  • LibCheck允许您比较程序集的两个版本并确定差异。该工具将差异报告为“已删除”和“已添加”API的组合:

      

    LibCheck -store HelloWorld.dll 1.0 -full C:\ HelloWorldV1 \
      LibCheck -store HelloWorld.dll 2.0 -full C:\ HelloWorldV2 \
      LibCheck -compare 1.0 2.0

另请参阅"Working with LibCheck""Highlight Public API Differences Between Assembly Revisions""Api Diff Between Assemblies"条款。

答案 1 :(得分:8)

我没有尝试过您链接的Java工具,但NDepend有一些强大的工具可用于比较两组二进制文件并突出显示任何差异。

答案 2 :(得分:0)

我还没有测试过,但是这个库 https://github.com/tunnelvisionlabs/dotnet-compatibility 似乎提供了你想要的东西。

https://raw.githubusercontent.com/tunnelvisionlabs/dotnet-compatibility/master/CompatibilityCheckExample/Program.cs

IPackageRepository sourceRepository = PackageRepositoryFactory.Default.CreateRepository("https://www.nuget.org/api/v2/");
PackageManager packageManager = new PackageManager(sourceRepository, temporaryDirectory);
packageManager.PackageInstalled += HandlePackageInstalled;
packageManager.InstallPackage("Microsoft.Bcl.Immutable", SemanticVersion.Parse("1.0.34"));
packageManager.InstallPackage("System.Collections.Immutable", SemanticVersion.Parse("1.1.33-beta"));

using (PEReader referenceAssembly = new PEReader(File.OpenRead(Path.Combine(temporaryDirectory, "Microsoft.Bcl.Immutable.1.0.34", "lib", "portable-net45+win8+wp8+wpa81", "System.Collections.Immutable.dll"))))
{
    using (PEReader newAssembly = new PEReader(File.OpenRead(Path.Combine(temporaryDirectory, "System.Collections.Immutable.1.1.33-beta", "lib", "portable-net45+win8+wp8+wpa81", "System.Collections.Immutable.dll"))))
    {
        Analyzer analyzer = new Analyzer(referenceAssembly, newAssembly, null);
        analyzer.Run();
    }
}