NDepend

Improve your .NET code quality with NDepend

.NET Core 3.0 New APIs

.NET Core 3.0 has just been released, see here the official announcement. In this post we’re going to explain how to list and explore the new APIs introduced since .NET Core 2.2 (this API diff is also available here).

To diff the API versions download NDepend trial, start VisualNDepend.exe, and click Compare 2 versions of a code base.

  • In the Older Build add assemblies in the folder: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.5
  • In the Newer Build add assemblies in the folder: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0

Then click OK. Depending on your hardware it’ll take between a dozen of seconds and a minute to analyze these two versions of .NET Core.

Here are the lists of new APIs obtained:

To obtain these lists we’ve edited 5 code queries and exported their results to HTML. For example to obtain the 28 new namespaces we edited the query:

And got this result, that also lists new types for each new namespace:

.NET Core 3.0 New Namespaces

The 4 others code queries used to list new types, new types and their members and new methods and new fields introduced in existing types are:




SOLID Design: The Dependency Inversion Principle (DIP)

After having covered the Open-Close Principle (OCP), the Liskov Substitution Principle (LSP), the Single Responsibility Principle (SRP) and the Interface Segregation Principle (ISP) let’s talk about the Dependency Inversion Principle (DIP) which is the D in the SOLID acronym. The DIP definition is:

a. High-level modules should not depend on low-level modules. Both should depend on abstractions.
b. Abstractions should not depend on details (concrete implementation). Details should depend on abstractions.

The DIP has been introduced in the 90s by Robert C Martin. Here is the original article.

A Dependency is a Risk

As all SOLID principles DIP is about system maintainability and reusability. Inevitably some parts of the system will evolve and will be modified. We want a design that is resilient to changes. To avoid that a change breaks too much, we must:

  • first identify parts of the code that are changes-prone.
  • second avoid dependencies on those changes-prone code portion.

The Liskov Substitution Principle (LSP) and the Interface Segregation Principle (ISP) articles explains that interfaces must be carefully thought out. Both principles are 2 faces of the same coin:

  • ISP is the client perspective: If an interface is too fat probably the client sees some behaviors it doesn’t care for.
  • LSP is the implementer perspective: If an interface is too fat probably a class that implements it won’t implement all its behaviors. Some behavior will end up throwing something like a NotSupportedException.

Efforts put in applying ISP and LSP result in interfaces stability. As a consequence these well-designed interfaces are less subject to changes than concrete classes that implement them.

Also having stable interfaces results in improved reusability. I am pretty confident that the interface IDisposable will never change. My classes can safely implement it and this interface is re-used all over the world.

In this context, the DIP states that depending on interfaces is less risky than depending on concrete implementations. DIP is about transforming this code:

into this code:

DIP is about removing dependencies from high-level code (like the ClientCode() method) to low-level code, low-level code being implementation details like the SqlConnection class. For that we create interfaces like IDbConnection. Then both high-level code and low-level code depend on these interfaces. The key is that SqlConnection is not visible anymore from the ClientCode(). This way the client code won’t be impacted by implementation changes, like when replacing the SQL Server RDBMS implementation with MySql for example.

Let’s underline that this minimal code sample doesn’t do justice to the word Inversion in the DIP acronym. The inversion is about interfaces introduced (to be consumed by high-level code) and implementation details: implementation details depends on the interfaces, not the opposite, here is the inversion.

DIP and Dependency Injection (DI)

The acronym DI is used for Dependency Injection and since it is almost the same as the DIP acronym this provokes confusion. The I is used for Inversion or Injection which might add up confusion. Hopefully DI and DIP are very much related.

  • DIP states that classes that implement interfaces are not visible to the client code.
  • DI is about binding classes behind the interfaces consumed by client code.

DI means that some code, external to client code, configures which classes will be used at runtime by the client code. This is simple DI:

Many .NET DI frameworks exist to offer flexibility in binding classes behind interfaces. Those frameworks are based on reflection and thus, they offer some kind of magic. The syntax looks like:

And then comes what is called a Service Locator. The client can use the locator to create instances of the concrete type without knowing it. It is like invoking a constructor on an interface:

Thus while DIP is about maintainable and reusable design, DI is about flexible design. Both are very much related. Let’s notice that the flexibility obtained from DI is especially useful for testing purposes. Being DIP compliant improves the testability of the code:

DIP and Inversion of Control (IoC)

The Inversion word is used both in DIP and IoC acronyms. This provokes confusion. Remember that the word Inversion in the DIP acronym is about implementation details depending on interfaces, not the opposite. The Inversion word in the IoC acronym is about calls to Library transformed into callbacks from Framework.

IoC is what differentiates a Framework from a Library. A library is typically a collection of functions and classes. On the other hands a framework also offers reusable classes but massively relies on callbacks. For example UI frameworks offers many callback points through graphical events:

The method m_ButtonOnClick() bound to the Button.OnClick event is a callback method. Instead of client code calling a framework method, the framework is responsible for calling back client code. This is an inversion in the control flow.

We can see that IoC is not related to DIP. However we can see Dependency Injection has a specialization of IoC:  DI is an IoC used specifically to manage dependencies.

DIP and the Level metric

Several code metrics can be used to measure, and thus constraint, the usage of DIP. One of these metric is the Level metric. The Level metric is defined as followed:

From this diagram we can infer that:

  • The Level metric is not defined for components involved in a dependency cycle. As a consequence null values can help tracking component dependency cycles.
  • The Level metric is defined for any dependency graph. Thus a Level metric can be defined for various granularity: methods, types, namespaces, assemblies.

DIP mostly states that types with Level 0 must be interfaces and enumerations (note that interfaces using others interfaces have a Level value higher than 0). If we say that a component is a group of types (like a namespace or an assembly) the DIP states that components with Level 0 must contain mostly interfaces and enumerations. With a quick code query like this one you can have a glance at types Level and check if most of low level types are interfaces:

The Level metric can also be used to track classes with high Level values: it is a good indication that some interfaces must be introduced to break the long chain of concrete code calls:

The class Program has a Level of 8 and if we look at the dependency graphs of types used from Program we can certainly see opportunities to introduce abstractions to be more DIP compliant:

DIP and the Abstractness vs. Instability Graph

Robert C. Martin not only coined the DIP but also proposed some code metrics to measure the DIP compliance. See these metrics definitions here. From these metrics an intriguing Abstractness vs. Instability diagram can be plotted. Here we plotted the 3 assemblies of the OSS eShopOnWeb application. This diagram has been obtained from an NDepend report:

  • The Abstractness metric is normalized : it takes its values in the range [0,1]. It measures the interfaces / classes ratio (1 means the assembly contains only interfaces and enumerations).
  • The Instability metric is normalized and measures the assembly’s resilience to change. In this context, being stable means that a lot of code depends on you (which is wrong for a concrete class and fine for an interface) and being unstable means the opposite: not much code depends on you (which is fine for a concrete class and wrong for an interface, a poorly used interface is potentially a waste of design efforts).

This diagram shows a balance between the two metrics and defines some green/orange/red zones:

  • A dot in the red Zone of Pain means that the assembly is mostly concrete and used a lot. This is a pain because all those concrete classes will likely undergo a lot of changes and each change will potentially impact a lot of code. An example of a class living in the Zone of Pain would be the String class. It is massively used but it is concrete: if a change should occur today in the String class the entire world would be impacted. Hopefully we can count on the String implementation to be both performance-wise and bug-free.
  • A dot in the red Zone of Uselessness means that the assembly contains mostly interfaces and enumerations and is not much used. This makes these abstractions useless.
  • The Green zone revolves around the Main Sequence line. This line represents the right balance between both metrics. Containing mostly interfaces and being used a lot is fine. Containing mostly classes and not being used much is fine. And then comes all intermediate well balanced values between these 2 extremes represented by the Main Sequence line. The Distance from Main Sequence metric can be normalized and measures this balance. A value close to 0 means that the dot is near the line, in the green zone, and that the DIP is respected.

Conclusion

As the Open-Close Principle (OCP), the Liskov Substitution Principle (LSP) and the Interface Segregation Principle (ISP) the DIP is a key principle to wisely harness the OOP abstraction and polymorphism concepts in order to improve the maintainability, the reusability and the testability of your code. No principle is an island (except maybe the Single Responsibility Principle (SRP)) and they must be applied hands-in-hands.

This article concludes this SOLID posts serie. Being aware of SOLID principles is not enough: they must be kept in mind during every design decision. But they also must be constrained by the KISS principle, Keep It Simple Stupid, because as we explained in the post Are SOLID principles Cargo Cult? it is easy to write entangled code in the name of SOLID principles. Then one can learn from experience. With years, identifying the right abstractions and partitioning properly the business needs in well balanced classes is becoming natural.

SOLID Design: The Interface Segregation Principle (ISP)

After having covered The Open-Close Principle (OCP), The Liskov Substitution Principle (LSP) and the Single Responsibility Principle (SRP) let’s talk about the Interface Segregation Principle (ISP) which is the I in the SOLID acronym. The ISP definition is:

Client should not be forced to depend on methods it does not use.

It is all about interface, the common abstractions available in most OOP language such as C#, VB.NET or Java. A more complete and actionable explanation of ISP is:

ISP splits interfaces that are very large into smaller and more specific ones so that clients will only have to know about the methods that are of interest to them. Such shrunken interfaces are also called role interfaces.

Roles and Responsibilities

When a class implements several shrunken role interfaces, it has several roles which might lead to think that such class has several responsibilities: it would then violate the Single Responsibility Services.

But a role is a finer-grained concept than a responsibility. An example of a role is the IDisposable interface:

This interface has a single method but it is implemented by a wide variety of classes: DB or network connections that need to be closed gracefully, UI elements that need to deallocate some bitmaps in memory… The only thing the IDisposable interface says to clients is that instances of IDisposable class needs a graceful shutdown.

Hence IDisposable represents a technical detail that the client needs to be aware of. It is much finer-grained concept than a responsibility.

A small interface is not necessarily a good abstraction

A single method interface often makes sense, an IExecutor that Execute(), an IVisitor that Visit(), an IParent that exposes Children { get; }. Often, such minimalist interface should be generic. For example the interface ICloneable available since the .NET Framework v1.1 is nowadays considered as a code smell: when using it the client needs to downcast the cloned Object reference returned to do anything useful with the cloned instance.

ICloneable has another major drawback: it doesn’t inform the client if the clone operation is deep or shallow. This problem is even more serious than the Object reference downcasting one: it is a real design problem. As we can see a minimalist interface is not necessarily a good abstraction. In this example, the lack of information means ambiguity for the client. This would have been better design:

A fat interface is not necessarily a design flaw

A rule like Avoid too large interfaces can certainly pinpoint most of the ISP violations. A threshold of 10 methods is proposed by default to define a too large interface.

However, as always with code metrics and static analysis, such rule can also spit some false positives. For example this fat interface is valid:

In such case the SuppressMessageAttribute can be used with a proper justification. Such justification embeds in the code itself the design decisions. It makes the source code more understandable and more maintainable:

ISP and the Liskov Substitution Principle (LSP)

ISP and LSP are like 2 faces of the same coin:

  • ISP is the client perspective: If an interface is too fat probably the client sees some behaviors it doesn’t care for.
  • LSP is the implementer perspective: If an interface is too fat probably a class that implements it won’t implement all its behaviors. Some behavior will end up throwing something like a NotSupportedException.

Remember the ICollection<T> interface already discussed in the LSP article. This interface forces all its implementers to implement an Add() method. From the Array class perspective, implementing ICollection<T> is a violation of the LSP because array doesn’t support element adding:

The same way many clients will only need a read-only view of consumed collections. ICollection<T> also violates the ISP: it forces those clients to be coupled with Add() / Insert() / Remove() methods they don’t need. The introduction of IReadOnlyCollection<T> solved both ISP and LSP violations.

This example also shows that ISP doesn’t necessarily mean that a class should implement several lightweight interfaces. It is fine to nest interfaces like russian-nesting-dolls. ICollection<T> is a bit fat, it does a lot, read, add, insert, remove, count… But this interface is well-adapted both for classes that are read/write collections and for clients that work on read/write collection. It makes more sense to nest both read/write behaviors into ICollection<T> than to decompose both behaviors into IReadOnlyCollection<T> and an hypothetical IWriteOnlyCollection<T> interface.

Btw, maybe you noticed that ICollection<T> actually doesn’t implement IReadOnlyCollection<T>. In an ideal world it should implement it but IReadOnlyCollection<T> was introduced several years after ICollection<T> and backward compatibility must be preserved: for example this class would have been broken if ICollection<T> was implementing IReadOnlyCollection<T>, because of the explicit interface implementation usage on ICollection<T>.Count:

Conclusion

ISP is about preventing inadvertent coupling between a client and some behaviors he/she won’t need. Being coupled with something unneeded is a problem:

  • In the best case it is a waste: this forces the client to consume precious brain-cycles to consider something he/she doesn’t need.
  • In the worst case it is error-prone: the client ends-up misusing the extra behaviors, like attempting to add an element to an array through ICollection<T>.Add().

As for all SOLID principles, ISP is better applied if you practice test-first, or at least, if you write tests and code at the same time. ISP is about the client perspective and writing tests transforms you for a while into a client of your code.

 


Out of curiosity I wrote this code query that can be re-used to attempt to measure compliance with the ISP.

This query estimates the ratio of usage of the methods of an interface over the maximum usage (maximum usage being when all types consuming an interface call all methods of the interface). Some work would be needed to transform this experimental query into a formal rule. For example the query needs to be smart about methods overloaded that can arguably be considered as a single method.

Nevertheless here are the raw results for non-public interfaces of the .NET framework implementation. Only non-public interfaces are considered because we need to also analyze some real clients of the interface:

927 types score tUsers interfaceMethods Full Name
IExceptionData 0.33 3 types 1 method Microsoft.Build.Tasks.Xsd.IExceptionData
IDtcNetworkAccessConfig 0.077 2 types 13 methods Microsoft.Tools.ServiceModel.WsatConfig .IDtcNetworkAccessConfig
INetFirewallOpenPort 0.6 1 type 15 methods Microsoft.Tools.ServiceModel.WsatConfig .INetFirewallOpenPort
INetFirewallOpenPortsCollection 0.6 1 type 5 methods Microsoft.Tools.ServiceModel.WsatConfig .INetFirewallOpenPortsCollection
INetFirewallProfile 0.071 1 type 14 methods Microsoft.Tools.ServiceModel.WsatConfig .INetFirewallProfile
INetFirewallPolicy 0.5 1 type 2 methods Microsoft.Tools.ServiceModel.WsatConfig .INetFirewallPolicy
INetFirewallMgr 0.2 1 type 5 methods Microsoft.Tools.ServiceModel.WsatConfig .INetFirewallMgr
IDtdInfo 0.056 23 types 7 methods System.Xml.IDtdInfo
IDtdAttributeListInfo 0.33 3 types 6 methods System.Xml.IDtdAttributeListInfo
IDtdAttributeInfo 0.39 4 types 7 methods System.Xml.IDtdAttributeInfo
IDtdDefaultAttributeInfo 0.11 9 types 4 methods System.Xml.IDtdDefaultAttributeInfo
IDtdEntityInfo 0.19 6 types 12 methods System.Xml.IDtdEntityInfo
IDtdParser 0.58 3 types 4 methods System.Xml.IDtdParser
IDtdParserAdapter 0.21 5 types 32 methods System.Xml.IDtdParserAdapter
IDtdParserAdapterWithValidation 0.75 2 types 2 methods System.Xml .IDtdParserAdapterWithValidation
IDtdParserAdapterV1 1 1 type 3 methods System.Xml.IDtdParserAdapterV1
IValidationEventHandling 0.3 10 types 2 methods System.Xml.IValidationEventHandling
IRemovableWriter 0.5 1 type 2 methods System.Xml.IRemovableWriter
INameScope 1 2 types 2 methods System.Xml.Serialization.INameScope
IXamlBuildProviderExtension 0.5 2 types 2 methods System.Xaml.Hosting .IXamlBuildProviderExtension
IXamlBuildProviderExtensionFactory 1 1 type 1 method System.Xaml.Hosting .IXamlBuildProviderExtensionFactory
IAddLineInfo 0.5 2 types 1 method MS.Internal.Xaml.Runtime.IAddLineInfo
ICheckIfInitialized 0.5 2 types 1 method MS.Internal.Xaml.Context .ICheckIfInitialized
IServiceDescriptionBuilder 1 1 type 1 method System.ServiceModel.Description .IServiceDescriptionBuilder
IExternalDataExchange 0.33 3 types 1 method System.ServiceModel.Activities .IExternalDataExchange
IWDEProgramNode 0 1 type 1 method System.Workflow.Runtime.DebugEngine .IWDEProgramNode
IWDEProgramPublisher 1 1 type 2 methods System.Workflow.Runtime.DebugEngine .IWDEProgramPublisher
ISupportWorkflowChanges 1 1 type 3 methods System.Workflow.ComponentModel .ISupportWorkflowChanges
ISupportAlternateFlow 1 11 types 1 method System.Workflow.ComponentModel .ISupportAlternateFlow
IDependencyObjectAccessor 0.3 10 types 4 methods System.Workflow.ComponentModel .IDependencyObjectAccessor
IWorkflowCoreRuntime 0.1 20 types 31 methods System.Workflow.ComponentModel .IWorkflowCoreRuntime
ITimerService 0.5 2 types 2 methods System.Workflow.ComponentModel .ITimerService
IWorkflowDesignerMessageSink 0.23 4 types 32 methods System.Workflow.ComponentModel.Design .IWorkflowDesignerMessageSink
IPropertyValueProvider 1 2 types 1 method System.Workflow.ComponentModel.Design .IPropertyValueProvider
IOleServiceProvider 0.5 2 types 1 method System.Workflow.ComponentModel.Compiler .IOleServiceProvider
IWorkflowBuildHostProperties 0.5 1 type 2 methods System.Workflow.ComponentModel.Compiler .IWorkflowBuildHostProperties
IWorkflowCompilerError 0 1 type 6 methods System.Workflow.ComponentModel.Compiler .IWorkflowCompilerError
IWorkflowCompilerErrorLogger 1 1 type 2 methods System.Workflow.ComponentModel.Compiler .IWorkflowCompilerErrorLogger
ISymUnmanagedReader 0.12 1 type 17 methods System.Workflow.ComponentModel.Compiler .ISymUnmanagedReader
ISymUnmanagedMethod 0.2 1 type 10 methods System.Workflow.ComponentModel.Compiler .ISymUnmanagedMethod
ISymUnmanagedDocument 0.1 1 type 10 methods System.Workflow.ComponentModel.Compiler .ISymUnmanagedDocument
IMetaDataDispenser 0.33 1 type 3 methods System.Workflow.ComponentModel.Compiler .IMetaDataDispenser
ITypeAuthorizer 0.33 3 types 1 method System.Workflow.ComponentModel .Serialization.ITypeAuthorizer
IDirectoryOperation 0.5 2 types 1 method System.Workflow.Activities .IDirectoryOperation
ICorrelationProvider 0.33 3 types 2 methods System.Workflow.Activities .ICorrelationProvider
IMethodResponseMessage 0.25 2 types 4 methods System.Workflow.Activities .IMethodResponseMessage
IDeliverMessage 0.33 3 types 2 methods System.Workflow.Activities .IDeliverMessage
IPropertyValueProvider 1 2 types 1 method System.Workflow.Activities.Common .IPropertyValueProvider
IAliasResolver 1 1 type 2 methods System.Resources.IAliasResolver
ISection 0 4 types 4 methods System.Deployment.Internal.Isolation .ISection
ISectionEntry 0 1 type 2 methods System.Deployment.Internal.Isolation .ISectionEntry
IEnumSTORE_ASSEMBLY_INSTALLATION_REFEREN CE 0 1 type 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_INSTALLATION_REFERE NCE
IEnumSTORE_DEPLOYMENT_METADATA 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA
IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY
IEnumSTORE_ASSEMBLY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY
IEnumSTORE_ASSEMBLY_FILE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_FILE
IEnumSTORE_CATEGORY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY
IEnumSTORE_CATEGORY_SUBCATEGORY 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_SUBCATEGORY
IEnumSTORE_CATEGORY_INSTANCE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_INSTANCE
IReferenceIdentity 0.071 7 types 4 methods System.Deployment.Internal.Isolation .IReferenceIdentity
IDefinitionIdentity 0.038 13 types 4 methods System.Deployment.Internal.Isolation .IDefinitionIdentity
IEnumDefinitionIdentity 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumDefinitionIdentity
IEnumReferenceIdentity 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumReferenceIdentity
IDefinitionAppId 0.059 17 types 6 methods System.Deployment.Internal.Isolation .IDefinitionAppId
IReferenceAppId 0.2 5 types 5 methods System.Deployment.Internal.Isolation .IReferenceAppId
IIdentityAuthority 0 1 type 18 methods System.Deployment.Internal.Isolation .IIdentityAuthority
IAppIdAuthority 0.062 3 types 16 methods System.Deployment.Internal.Isolation .IAppIdAuthority
IStore 0.24 4 types 20 methods System.Deployment.Internal.Isolation .IStore
IManifestParseErrorCallback 0 1 type 1 method System.Deployment.Internal.Isolation .IManifestParseErrorCallback
IManifestInformation 0.5 2 types 1 method System.Deployment.Internal.Isolation .IManifestInformation
IActContext 0.28 2 types 18 methods System.Deployment.Internal.Isolation .IActContext
ICMS 0.011 4 types 22 methods System.Deployment.Internal.Isolation .Manifest.ICMS
IDescriptionMetadataEntry 0.43 1 type 7 methods System.Deployment.Internal.Isolation .Manifest.IDescriptionMetadataEntry
IDeploymentMetadataEntry 0.17 1 type 6 methods System.Deployment.Internal.Isolation .Manifest.IDeploymentMetadataEntry
IMetadataSectionEntry 0.14 1 type 21 methods System.Deployment.Internal.Isolation .Manifest.IMetadataSectionEntry
FileDialogNative+IModalWindow 0 1 type 1 method System.Windows.Forms .FileDialogNative+IModalWindow
FileDialogNative+IShellItemArray 0.14 2 types 7 methods System.Windows.Forms .FileDialogNative+IShellItemArray
FileDialogNative+IFileDialog 0.017 5 types 24 methods System.Windows.Forms .FileDialogNative+IFileDialog
FileDialogNative+IFileOpenDialog 0.038 2 types 26 methods System.Windows.Forms .FileDialogNative+IFileOpenDialog
FileDialogNative+IFileSaveDialog 0 2 types 29 methods System.Windows.Forms .FileDialogNative+IFileSaveDialog
FileDialogNative+IFileDialogEvents 0 1 type 7 methods System.Windows.Forms .FileDialogNative+IFileDialogEvents
FileDialogNative+IShellItem 0 7 types 5 methods System.Windows.Forms .FileDialogNative+IShellItem
IKeyboardToolTip 0.23 4 types 13 methods System.Windows.Forms.IKeyboardToolTip
ISupportOleDropSource 1 1 type 2 methods System.Windows.Forms .ISupportOleDropSource
ISupportToolStripPanel 0.27 6 types 8 methods System.Windows.Forms .ISupportToolStripPanel
ListView+ListViewItemCollection+IInnerLi st 0.31 3 types 15 methods System.Windows.Forms .ListView+ListViewItemCollection+IInnerL ist
NativeMethods+IHTMLDocument 0 1 type 1 method System.Windows.Forms .NativeMethods+IHTMLDocument
UnsafeNativeMethods+IHTMLDocument 0 6 types 1 method System.Windows.Forms .UnsafeNativeMethods+IHTMLDocument
UnsafeNativeMethods+IHTMLDocument2 0.057 6 types 109 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLDocument2
UnsafeNativeMethods+IHTMLDocument3 0.049 3 types 41 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLDocument3
UnsafeNativeMethods+IHTMLDocument4 0.071 2 types 14 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLDocument4
UnsafeNativeMethods+IHTMLFramesCollectio n2 0.33 3 types 2 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLFramesCollecti on2
UnsafeNativeMethods+IHTMLLocation 0.039 4 types 19 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLLocation
UnsafeNativeMethods+IOmHistory 0.17 3 types 4 methods System.Windows.Forms .UnsafeNativeMethods+IOmHistory
UnsafeNativeMethods+IOmNavigator 0 1 type 19 methods System.Windows.Forms .UnsafeNativeMethods+IOmNavigator
UnsafeNativeMethods+IHTMLEventObj 0.14 5 types 25 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLEventObj
UnsafeNativeMethods+IHTMLEventObj2 0 1 type 56 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLEventObj2
UnsafeNativeMethods+IHTMLEventObj4 0 1 type 1 method System.Windows.Forms .UnsafeNativeMethods+IHTMLEventObj4
UnsafeNativeMethods+IHTMLElementCollecti on 0.083 4 types 6 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLElementCollect ion
UnsafeNativeMethods+IHTMLElement 0.043 7 types 87 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLElement
UnsafeNativeMethods+IHTMLElement2 0.065 3 types 98 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLElement2
UnsafeNativeMethods+IHTMLElement3 0.035 2 types 43 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLElement3
UnsafeNativeMethods+IHTMLStyle 0.0056 2 types 178 methods System.Windows.Forms .UnsafeNativeMethods+IHTMLStyle
UnsafeNativeMethods+ICorRuntimeHost 0.026 2 types 19 methods System.Windows.Forms .UnsafeNativeMethods+ICorRuntimeHost
UnsafeNativeMethods+IServiceProvider 0 1 type 1 method System.Windows.Forms .UnsafeNativeMethods+IServiceProvider
UnsafeNativeMethods+IAccessibleEx 0 1 type 4 methods System.Windows.Forms .UnsafeNativeMethods+IAccessibleEx
PropertyGridView+IMouseHookClient 0.5 2 types 1 method System.Windows.Forms .PropertyGridInternal .PropertyGridView+IMouseHookClient
IArrangedElement 0.12 32 types 9 methods System.Windows.Forms.Layout .IArrangedElement
IDataPointCustomPropertiesProvider 1 1 type 1 method System.Windows.Forms.DataVisualization .Charting .IDataPointCustomPropertiesProvider
IChartElement 0.25 4 types 4 methods System.Windows.Forms.DataVisualization .Charting.IChartElement
INameController 0.57 1 type 7 methods System.Windows.Forms.DataVisualization .Charting.INameController
IChartRenderingEngine 0.93 1 type 45 methods System.Windows.Forms.DataVisualization .Charting.IChartRenderingEngine
IDesignerMessageBoxDialog 0.5 2 types 1 method System.Windows.Forms.DataVisualization .Charting.IDesignerMessageBoxDialog
IFormula 0.25 2 types 2 methods System.Windows.Forms.DataVisualization .Charting.Formulas.IFormula
IChartType 0.11 13 types 22 methods System.Windows.Forms.DataVisualization .Charting.ChartTypes.IChartType
ICircularChartType 0.17 5 types 6 methods System.Windows.Forms.DataVisualization .Charting.ChartTypes.ICircularChartType
IBorderType 0.3 4 types 5 methods System.Windows.Forms.DataVisualization .Charting.Borders3D.IBorderType
INotifyConnection2 0.5 2 types 2 methods System.Web.Services.Interop .INotifyConnection2
INotifySink2 0.5 2 types 4 methods System.Web.Services.Interop.INotifySink2
INotifySource2 0 1 type 1 method System.Web.Services.Interop .INotifySource2
IDeviceSpecificChoiceDesigner 0.5 4 types 2 methods System.Web.UI.Design.MobileControls .IDeviceSpecificChoiceDesigner
IDeviceSpecificDesigner 0.15 11 types 10 methods System.Web.UI.Design.MobileControls .IDeviceSpecificDesigner
IListDesigner 0.05 2 types 10 methods System.Web.UI.Design.MobileControls .IListDesigner
IRefreshableDeviceSpecificEditor 0.5 2 types 7 methods System.Web.UI.Design.MobileControls .IRefreshableDeviceSpecificEditor
NativeMethods+IStream 0 1 type 11 methods System.Web.UI.Design.MobileControls .NativeMethods+IStream
NativeMethods+IHTMLElement 0.0077 3 types 87 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLElement
NativeMethods+IHTMLDocument2 0.0055 5 types 109 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLDocument2
NativeMethods+IHTMLDocument3 0.012 2 types 41 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLDocument3
NativeMethods+IHTMLStyleSheet 0 1 type 21 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLStyleSheet
NativeMethods+IHTMLStyle 0 1 type 178 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLStyle
NativeMethods+IHTMLElementCollection 0 1 type 6 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLElementCollection
NativeMethods+IHTMLDOMNode 0 1 type 20 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLDOMNode
NativeMethods+IOleContainer 0 2 types 3 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleContainer
NativeMethods+IOleClientSite 0 1 type 6 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleClientSite
NativeMethods+IOleDocumentSite 0 1 type 1 method System.Web.UI.Design.MobileControls .NativeMethods+IOleDocumentSite
NativeMethods+IOleDocumentView 0.15 2 types 13 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleDocumentView
NativeMethods+IOleInPlaceSite 0 1 type 12 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleInPlaceSite
NativeMethods+IOleInPlaceFrame 0 1 type 12 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleInPlaceFrame
NativeMethods+IOleInPlaceUIWindow 0 2 types 6 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleInPlaceUIWindow
NativeMethods+IDocHostUIHandler 0 1 type 15 methods System.Web.UI.Design.MobileControls .NativeMethods+IDocHostUIHandler
NativeMethods+IOleInPlaceActiveObject 0 2 types 7 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleInPlaceActiveObject
NativeMethods+IOleObject 0.048 2 types 21 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleObject
NativeMethods+IOleCommandTarget 0 2 types 2 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleCommandTarget
NativeMethods+IOleDropTarget 0 2 types 4 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleDropTarget
NativeMethods+IOleDataObject 0 2 types 9 methods System.Web.UI.Design.MobileControls .NativeMethods+IOleDataObject
NativeMethods+IEnumOLEVERB 0 1 type 4 methods System.Web.UI.Design.MobileControls .NativeMethods+IEnumOLEVERB
NativeMethods+IAdviseSink 0 1 type 5 methods System.Web.UI.Design.MobileControls .NativeMethods+IAdviseSink
NativeMethods+IHTMLBodyElement 0.014 2 types 35 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLBodyElement
NativeMethods+IPersistStreamInit 0.083 2 types 6 methods System.Web.UI.Design.MobileControls .NativeMethods+IPersistStreamInit
NativeMethods+IHTMLElement2 0.0094 3 types 106 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLElement2
NativeMethods+IHTMLRectCollection 0.33 2 types 3 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLRectCollection
NativeMethods+IHTMLCurrentStyle 0 1 type 67 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLCurrentStyle
NativeMethods+IHTMLRect 0.12 2 types 8 methods System.Web.UI.Design.MobileControls .NativeMethods+IHTMLRect
IListControl 1 1 type 2 methods System.Web.UI.MobileControls .IListControl
IScriptResourceHandler 1 1 type 3 methods System.Web.Handlers .IScriptResourceHandler
IContractGeneratorReferenceTypeLoader 0.5 2 types 3 methods System.Web.Compilation.WCFModel .IContractGeneratorReferenceTypeLoader
IContractGeneratorReferenceTypeLoader2 1 1 type 1 method System.Web.Compilation.WCFModel .IContractGeneratorReferenceTypeLoader2
IClientScriptManager 0.14 5 types 7 methods System.Web.UI.IClientScriptManager
IClientUrlResolver 0.4 5 types 2 methods System.Web.UI.IClientUrlResolver
ICompilationSection 1 1 type 1 method System.Web.UI.ICompilationSection
IControl 0.25 2 types 2 methods System.Web.UI.IControl
ICustomErrorsSection 0.5 2 types 2 methods System.Web.UI.ICustomErrorsSection
IDeploymentSection 1 1 type 1 method System.Web.UI.IDeploymentSection
IHtmlForm 0.33 3 types 4 methods System.Web.UI.IHtmlForm
IPage 0.12 8 types 31 methods System.Web.UI.IPage
IScriptManagerInternal 0.17 4 types 12 methods System.Web.UI.IScriptManagerInternal
IDynamicQueryable 0.14 2 types 7 methods System.Web.UI.WebControls .IDynamicQueryable
ILinqToSql 0.67 1 type 6 methods System.Web.UI.WebControls.ILinqToSql
ILinqDataSourceChooseContextType 0.44 2 types 8 methods System.Web.UI.Design.WebControls .ILinqDataSourceChooseContextType
ILinqDataSourceChooseContextTypePanel 0.5 2 types 4 methods System.Web.UI.Design.WebControls .ILinqDataSourceChooseContextTypePanel
ILinqDataSourceConfiguration 0.5 2 types 8 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfiguration
ILinqDataSourceConfigurationPanel 0.5 2 types 8 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigurationPanel
ILinqDataSourceConfigureAdvanced 0.5 2 types 1 method System.Web.UI.Design.WebControls .ILinqDataSourceConfigureAdvanced
ILinqDataSourceConfigureAdvancedForm 0.33 3 types 4 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureAdvancedForm
ILinqDataSourceConfigureGroupBy 0.42 2 types 6 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureGroupBy
ILinqDataSourceConfigureGroupByPanel 0.33 3 types 7 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureGroupByPanel
ILinqDataSourceConfigureOrderBy 0.33 2 types 3 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureOrderBy
ILinqDataSourceConfigureOrderByForm 0.33 3 types 6 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureOrderByForm
ILinqDataSourceConfigureSelect 0.42 2 types 6 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureSelect
ILinqDataSourceConfigureSelectPanel 0.33 3 types 22 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureSelectPanel
ILinqDataSourceConfigureWhere 0.25 4 types 16 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureWhere
ILinqDataSourceConfigureWhereForm 0.28 4 types 15 methods System.Web.UI.Design.WebControls .ILinqDataSourceConfigureWhereForm
ILinqDataSourceContextTypeItem 0.22 9 types 3 methods System.Web.UI.Design.WebControls .ILinqDataSourceContextTypeItem
ILinqDataSourceDesignerHelper 0.086 13 types 67 methods System.Web.UI.Design.WebControls .ILinqDataSourceDesignerHelper
ILinqDataSourceProjection 0.25 5 types 8 methods System.Web.UI.Design.WebControls .ILinqDataSourceProjection
ILinqDataSourcePropertyItem 0.099 22 types 11 methods System.Web.UI.Design.WebControls .ILinqDataSourcePropertyItem
ILinqDataSourceStatementEditorForm 0.38 2 types 4 methods System.Web.UI.Design.WebControls .ILinqDataSourceStatementEditorForm
ILinqDataSourceWizardForm 0.33 6 types 2 methods System.Web.UI.Design.WebControls .ILinqDataSourceWizardForm
ILinqDataSourceWrapper 0.5 2 types 44 methods System.Web.UI.Design.WebControls .ILinqDataSourceWrapper
IMetaChildrenColumn 0.17 1 type 6 methods System.Web.DynamicData .IMetaChildrenColumn
IMetaColumn 0.073 6 types 39 methods System.Web.DynamicData.IMetaColumn
IMetaForeignKeyColumn 0.17 2 types 9 methods System.Web.DynamicData .IMetaForeignKeyColumn
IMetaModel 0.019 3 types 18 methods System.Web.DynamicData.IMetaModel
IMetaTable 0.035 10 types 43 methods System.Web.DynamicData.IMetaTable
MetaColumn+IMetaColumnMetadata 0.37 3 types 20 methods System.Web.DynamicData .MetaColumn+IMetaColumnMetadata
IClrStrongNameUsingIntPtr 0.24 1 type 25 methods Microsoft.Runtime.Hosting .IClrStrongNameUsingIntPtr
IClrStrongName 0.36 1 type 25 methods Microsoft.Runtime.Hosting.IClrStrongName
IRequestCompletedNotifier 0.5 2 types 1 method System.Web.IRequestCompletedNotifier
IBufferAllocator 0.083 3 types 4 methods System.Web.IBufferAllocator
IBufferAllocator<T> 0.33 4 types 3 methods System.Web.IBufferAllocator<T>
IAllocatorProvider 0.25 5 types 4 methods System.Web.IAllocatorProvider
HttpApplication+IExecutionStep 0.2 5 types 3 methods System.Web .HttpApplication+IExecutionStep
IHttpResponseElement 0.83 2 types 3 methods System.Web.IHttpResponseElement
IHttpHandlerFactory2 1 1 type 1 method System.Web.IHttpHandlerFactory2
IPartitionInfo 0.25 4 types 1 method System.Web.IPartitionInfo
IAsyncAbortableWebSocket 0.5 2 types 1 method System.Web.WebSockets .IAsyncAbortableWebSocket
IWebSocketPipe 0.5 2 types 4 methods System.Web.WebSockets.IWebSocketPipe
IUnmanagedWebSocketContext 0.5 2 types 5 methods System.Web.WebSockets .IUnmanagedWebSocketContext
IPerfCounters 0.12 4 types 4 methods System.Web.Util.IPerfCounters
ISyncContextLock 0.33 3 types 1 method System.Web.Util.ISyncContextLock
ISyncContext 0.2 5 types 2 methods System.Web.Util.ISyncContext
ITypedWebObjectFactory 1 4 types 1 method System.Web.Util.ITypedWebObjectFactory
ICustomRuntimeRegistrationToken 0 2 types 1 method System.Web.Hosting .ICustomRuntimeRegistrationToken
IProcessSuspendListener 1 1 type 1 method System.Web.Hosting .IProcessSuspendListener
IProcessResumeCallback 0.5 2 types 1 method System.Web.Hosting .IProcessResumeCallback
ICustomRuntime 0 3 types 3 methods System.Web.Hosting.ICustomRuntime
IStateFormatter2 0.62 8 types 2 methods System.Web.UI.IStateFormatter2
IPageAsyncTask 0.5 2 types 1 method System.Web.UI.IPageAsyncTask
IAssemblyDependencyParser 1 1 type 1 method System.Web.UI.IAssemblyDependencyParser
IScriptResourceMapping 0.5 3 types 2 methods System.Web.UI.IScriptResourceMapping
IScriptResourceDefinition 0.33 3 types 8 methods System.Web.UI.IScriptResourceDefinition
IScriptManager 0.15 11 types 17 methods System.Web.UI.IScriptManager
ITagNameToTypeMapper 1 1 type 1 method System.Web.UI.ITagNameToTypeMapper
IRenderOuterTableControl 1 1 type 3 methods System.Web.UI.IRenderOuterTableControl
IWizardSideBarListControl 0.1 5 types 12 methods System.Web.UI.WebControls .IWizardSideBarListControl
IWebPartMenuUser 1 1 type 16 methods System.Web.UI.WebControls.WebParts .IWebPartMenuUser
NativeComInterfaces+IAdsPathname 0.12 3 types 11 methods System.Web.Security .NativeComInterfaces+IAdsPathname
NativeComInterfaces+IAdsLargeInteger 0.5 3 types 4 methods System.Web.Security .NativeComInterfaces+IAdsLargeInteger
IDataProtectorFactory 0.5 2 types 1 method System.Web.Security.Cryptography .IDataProtectorFactory
ICryptoServiceProvider 1 1 type 1 method System.Web.Security.Cryptography .ICryptoServiceProvider
IMasterKeyProvider 0.5 2 types 2 methods System.Web.Security.Cryptography .IMasterKeyProvider
ICryptoAlgorithmFactory 0.5 2 types 2 methods System.Web.Security.Cryptography .ICryptoAlgorithmFactory
ICryptoService 0.83 6 types 2 methods System.Web.Security.Cryptography .ICryptoService
IAssemblyCache 0.2 2 types 5 methods System.Web.Configuration.IAssemblyCache
IConfigMapPath2 0.67 2 types 3 methods System.Web.Configuration.IConfigMapPath2
IServerConfig 0.2 6 types 5 methods System.Web.Configuration.IServerConfig
IServerConfig2 1 1 type 1 method System.Web.Configuration.IServerConfig2
IDataPointCustomPropertiesProvider 1 1 type 1 method System.Web.UI.DataVisualization.Charting .IDataPointCustomPropertiesProvider
IChartElement 0.25 3 types 4 methods System.Web.UI.DataVisualization.Charting .IChartElement
INameController 0.57 1 type 7 methods System.Web.UI.DataVisualization.Charting .INameController
IChartRenderingEngine 0.93 1 type 45 methods System.Web.UI.DataVisualization.Charting .IChartRenderingEngine
IDesignerMessageBoxDialog 0.5 2 types 1 method System.Web.UI.DataVisualization.Charting .IDesignerMessageBoxDialog
IFormula 0.25 2 types 2 methods System.Web.UI.DataVisualization.Charting .Formulas.IFormula
IChartType 0.11 14 types 22 methods System.Web.UI.DataVisualization.Charting .ChartTypes.IChartType
ICircularChartType 0.17 5 types 6 methods System.Web.UI.DataVisualization.Charting .ChartTypes.ICircularChartType
IBorderType 0.3 4 types 5 methods System.Web.UI.DataVisualization.Charting .Borders3D.IBorderType
IMembershipAdapter 0.27 3 types 5 methods System.Web.Security.IMembershipAdapter
ICustomLoaderHelperFunctions 0.5 2 types 4 methods System.Web.Hosting .ICustomLoaderHelperFunctions
IPromotedEnlistment 0.089 14 types 12 methods System.Transactions.IPromotedEnlistment
IEnlistmentNotificationInternal 0.28 8 types 4 methods System.Transactions .IEnlistmentNotificationInternal
ISinglePhaseNotificationInternal 0.25 4 types 1 method System.Transactions .ISinglePhaseNotificationInternal
IVoterBallotShim 0.5 2 types 1 method System.Transactions.Oletx .IVoterBallotShim
IPhase0EnlistmentShim 0.38 4 types 2 methods System.Transactions.Oletx .IPhase0EnlistmentShim
IEnlistmentShim 0.5 2 types 3 methods System.Transactions.Oletx .IEnlistmentShim
ITransactionShim 0.25 4 types 8 methods System.Transactions.Oletx .ITransactionShim
IResourceManagerShim 0.44 3 types 3 methods System.Transactions.Oletx .IResourceManagerShim
IDtcProxyShimFactory 0.2 5 types 8 methods System.Transactions.Oletx .IDtcProxyShimFactory
ITransactionNativeInternal 0.33 1 type 3 methods System.Transactions.Oletx .ITransactionNativeInternal
IWebFaultException 1 1 type 4 methods System.ServiceModel.Web .IWebFaultException
IDuplexRouterCallback 0.33 3 types 2 methods System.ServiceModel.Routing .IDuplexRouterCallback
IRoutingClient 0.23 5 types 7 methods System.ServiceModel.Routing .IRoutingClient
IAsyncEventArgs 0.7 5 types 2 methods System.Runtime.IAsyncEventArgs
IClassFactory 0.25 2 types 2 methods IClassFactory
IOperationContractAttributeProvider 1 1 type 1 method System.ServiceModel .IOperationContractAttributeProvider
ICatalog2 0.018 1 type 57 methods System.ServiceModel.ComIntegration .ICatalog2
ICatalogObject 0.24 3 types 7 methods System.ServiceModel.ComIntegration .ICatalogObject
ICatalogCollection 0.17 3 types 16 methods System.ServiceModel.ComIntegration .ICatalogCollection
ICreateServiceChannel 1 1 type 1 method System.ServiceModel.ComIntegration .ICreateServiceChannel
IMoniker 0 1 type 20 methods System.ServiceModel.ComIntegration .IMoniker
IParseDisplayName 0 1 type 1 method System.ServiceModel.ComIntegration .IParseDisplayName
IProvideChannelBuilderSettings 0.12 4 types 4 methods System.ServiceModel.ComIntegration .IProvideChannelBuilderSettings
IProxyCreator 0.5 2 types 4 methods System.ServiceModel.ComIntegration .IProxyCreator
IProxyManager 0 4 types 6 methods System.ServiceModel.ComIntegration .IProxyManager
IProxyProvider 0.5 2 types 2 methods System.ServiceModel.ComIntegration .IProxyProvider
IPseudoDispatch 0 1 type 2 methods System.ServiceModel.ComIntegration .IPseudoDispatch
ITransactionProxy 0 1 type 7 methods System.ServiceModel.ComIntegration .ITransactionProxy
ITransactionVoterBallotAsync2 0 1 type 1 method System.ServiceModel.ComIntegration .ITransactionVoterBallotAsync2
ITransactionVoterNotifyAsync2 0.4 2 types 5 methods System.ServiceModel.ComIntegration .ITransactionVoterNotifyAsync2
ITypeCacheManager 0.33 3 types 4 methods System.ServiceModel.ComIntegration .ITypeCacheManager
IPersistStream 0.2 3 types 5 methods System.ServiceModel.ComIntegration .IPersistStream
IServiceThreadPoolConfig 1 1 type 2 methods System.ServiceModel.ComIntegration .IServiceThreadPoolConfig
IServicePartitionConfig 1 1 type 2 methods System.ServiceModel.ComIntegration .IServicePartitionConfig
IServiceSysTxnConfig 0.14 1 type 7 methods System.ServiceModel.ComIntegration .IServiceSysTxnConfig
IServiceSxsConfig 1 1 type 3 methods System.ServiceModel.ComIntegration .IServiceSxsConfig
IServiceTransactionConfig 0.17 1 type 6 methods System.ServiceModel.ComIntegration .IServiceTransactionConfig
IServiceCall 0 1 type 1 method System.ServiceModel.ComIntegration .IServiceCall
IServiceActivity 0.25 2 types 4 methods System.ServiceModel.ComIntegration .IServiceActivity
IComThreadingInfo 0.17 3 types 4 methods System.ServiceModel.ComIntegration .IComThreadingInfo
IObjectContextInfo 0.3 2 types 5 methods System.ServiceModel.ComIntegration .IObjectContextInfo
IContractResolver 0.2 5 types 1 method System.ServiceModel.Description .IContractResolver
ServiceMetadataExtension+IHttpGetMetadat a 0 2 types 1 method System.ServiceModel.Description .ServiceMetadataExtension+IHttpGetMetada ta
IWrappedBodyTypeGenerator 0.25 4 types 3 methods System.ServiceModel.Description .IWrappedBodyTypeGenerator
WbemNative+IWbemProviderInit 0 1 type 1 method System.ServiceModel.Administration .WbemNative+IWbemProviderInit
WbemNative+IWbemDecoupledRegistrar 0.5 2 types 2 methods System.ServiceModel.Administration .WbemNative+IWbemDecoupledRegistrar
WbemNative+IWbemServices 0.022 4 types 23 methods System.ServiceModel.Administration .WbemNative+IWbemServices
WbemNative+IWbemClassObject 0.056 6 types 24 methods System.ServiceModel.Administration .WbemNative+IWbemClassObject
WbemNative+IWbemContext 0 5 types 9 methods System.ServiceModel.Administration .WbemNative+IWbemContext
WbemNative+IWbemProviderInitSink 0.5 2 types 1 method System.ServiceModel.Administration .WbemNative+IWbemProviderInitSink
WbemNative+IWbemObjectSink 0.33 6 types 2 methods System.ServiceModel.Administration .WbemNative+IWbemObjectSink
WbemNative+IEnumWbemClassObject 0 2 types 5 methods System.ServiceModel.Administration .WbemNative+IEnumWbemClassObject
WbemNative+IWbemQualifierSet 0 1 type 7 methods System.ServiceModel.Administration .WbemNative+IWbemQualifierSet
IWmiProvider 0.5 2 types 5 methods System.ServiceModel.Administration .IWmiProvider
IWmiInstances 0.75 8 types 2 methods System.ServiceModel.Administration .IWmiInstances
IWmiInstance 0.44 22 types 3 methods System.ServiceModel.Administration .IWmiInstance
IWmiMethodContext 0.27 3 types 5 methods System.ServiceModel.Administration .IWmiMethodContext
IWmiInstanceProvider 1 3 types 2 methods System.ServiceModel.Administration .IWmiInstanceProvider
IFunctionLibrary 1 1 type 1 method System.ServiceModel.Dispatcher .IFunctionLibrary
INodeCounter 0.5 2 types 6 methods System.ServiceModel.Dispatcher .INodeCounter
IItemComparer<K,V> 0.5 2 types 1 method System.ServiceModel.Dispatcher .IItemComparer<K,V>
ConcurrencyBehavior+IWaiter 0.5 2 types 1 method System.ServiceModel.Dispatcher .ConcurrencyBehavior+IWaiter
IClientFaultFormatter 0.33 6 types 1 method System.ServiceModel.Dispatcher .IClientFaultFormatter
IDispatchFaultFormatter 0.22 9 types 1 method System.ServiceModel.Dispatcher .IDispatchFaultFormatter
IDispatchFaultFormatterWrapper 0.5 1 type 2 methods System.ServiceModel.Dispatcher .IDispatchFaultFormatterWrapper
IChannelBinder 0.076 23 types 20 methods System.ServiceModel.Dispatcher .IChannelBinder
IListenerBinder 0.3 4 types 5 methods System.ServiceModel.Dispatcher .IListenerBinder
IManualConcurrencyOperationInvoker 0.56 3 types 3 methods System.ServiceModel.Dispatcher .IManualConcurrencyOperationInvoker
IInvokeReceivedNotification 0.19 8 types 2 methods System.ServiceModel.Dispatcher .IInvokeReceivedNotification
IResumeMessageRpc 0.17 8 types 6 methods System.ServiceModel.Dispatcher .IResumeMessageRpc
IInstanceTransaction 1 1 type 1 method System.ServiceModel.Dispatcher .IInstanceTransaction
IInstanceContextManager 0.4 1 type 10 methods System.ServiceModel.Dispatcher .IInstanceContextManager
ISessionThrottleNotification 1 1 type 1 method System.ServiceModel.Dispatcher .ISessionThrottleNotification
IConfigurationContextProviderInternal 0.33 3 types 2 methods System.ServiceModel.Configuration .IConfigurationContextProviderInternal
ILockingQueue 1 1 type 2 methods System.ServiceModel.Channels .ILockingQueue
IChannelDemuxer 1 2 types 7 methods System.ServiceModel.Channels .IChannelDemuxer
IChannelDemuxFailureHandler 0.16 11 types 4 methods System.ServiceModel.Channels .IChannelDemuxFailureHandler
IChannelAcceptor<TChannel> 0 12 types 6 methods System.ServiceModel.Channels .IChannelAcceptor<TChannel>
IRequestReplyCorrelator 0.17 6 types 2 methods System.ServiceModel.Channels .IRequestReplyCorrelator
ICorrelatorKey 0.5 2 types 2 methods System.ServiceModel.Channels .ICorrelatorKey
ICommunicationWaiter 0.75 2 types 2 methods System.ServiceModel.Channels .ICommunicationWaiter
RemoteEndpointMessageProperty+IRemoteEnd pointProvider 0.5 2 types 2 methods System.ServiceModel.Channels .RemoteEndpointMessageProperty+IRemoteEn dpointProvider
IRequestBase 0.33 1 type 3 methods System.ServiceModel.Channels .IRequestBase
IRequest 0 3 types 2 methods System.ServiceModel.Channels.IRequest
IAsyncRequest 0 3 types 2 methods System.ServiceModel.Channels .IAsyncRequest
IConnectionOrientedListenerSettings 0 5 types 4 methods System.ServiceModel.Channels .IConnectionOrientedListenerSettings
ITransportFactorySettings 0.2 16 types 5 methods System.ServiceModel.Channels .ITransportFactorySettings
IConnectionOrientedTransportFactorySetti ngs 0.092 19 types 4 methods System.ServiceModel.Channels .IConnectionOrientedTransportFactorySett ings
IConnectionOrientedTransportChannelFacto rySettings 0 6 types 2 methods System.ServiceModel.Channels .IConnectionOrientedTransportChannelFact orySettings
ITcpChannelFactorySettings 0.5 2 types 1 method System.ServiceModel.Channels .ITcpChannelFactorySettings
IHttpTransportFactorySettings 0.042 12 types 2 methods System.ServiceModel.Channels .IHttpTransportFactorySettings
IPipeTransportFactorySettings 0.33 3 types 1 method System.ServiceModel.Channels .IPipeTransportFactorySettings
ITransportManagerRegistration 0 7 types 3 methods System.ServiceModel.Channels .ITransportManagerRegistration
IChannelBindingProvider 0.5 11 types 2 methods System.ServiceModel.Channels .IChannelBindingProvider
IStreamUpgradeChannelBindingProvider 0.5 6 types 2 methods System.ServiceModel.Channels .IStreamUpgradeChannelBindingProvider
IConnection 0.078 62 types 19 methods System.ServiceModel.Channels.IConnection
IConnectionInitiator 0.095 7 types 3 methods System.ServiceModel.Channels .IConnectionInitiator
IConnectionListener 0.12 8 types 3 methods System.ServiceModel.Channels .IConnectionListener
IMessageSource 0.14 7 types 6 methods System.ServiceModel.Channels .IMessageSource
ISingletonChannelListener 0.14 7 types 2 methods System.ServiceModel.Channels .ISingletonChannelListener
ISocketListenerSettings 0.5 2 types 3 methods System.ServiceModel.Channels .ISocketListenerSettings
HttpChannelListener+IHttpAuthenticationC ontext 0.38 2 types 4 methods System.ServiceModel.Channels .HttpChannelListener+IHttpAuthentication Context
HttpRequestMessageProperty+IHttpHeaderPr ovider 0.25 4 types 1 method System.ServiceModel.Channels .HttpRequestMessageProperty+IHttpHeaderP rovider
IWebMessageEncoderHelper 1 1 type 1 method System.ServiceModel.Channels .IWebMessageEncoderHelper
ITransportPolicyImport 1 2 types 1 method System.ServiceModel.Channels .ITransportPolicyImport
IPoisonHandlingStrategy 0.5 2 types 3 methods System.ServiceModel.Channels .IPoisonHandlingStrategy
IMsmqMessagePool 0.25 4 types 2 methods System.ServiceModel.Channels .IMsmqMessagePool
IPostRollbackErrorStrategy 1 2 types 1 method System.ServiceModel.Channels .IPostRollbackErrorStrategy
MsmqUri+IAddressTranslator 0.29 26 types 3 methods System.ServiceModel.Channels .MsmqUri+IAddressTranslator
IReliableChannelBinder 0.07 47 types 36 methods System.ServiceModel.Channels .IReliableChannelBinder
IClientReliableChannelBinder 0.083 16 types 9 methods System.ServiceModel.Channels .IClientReliableChannelBinder
IServerReliableChannelBinder 0.12 24 types 5 methods System.ServiceModel.Channels .IServerReliableChannelBinder
IReliableFactorySettings 0.19 10 types 10 methods System.ServiceModel.Channels .IReliableFactorySettings
DatagramAdapter+DatagramAdapterListenerB ase<TChannel,TSessionChannel,ItemType >+IWaiter 0 1 type 1 method System.ServiceModel.Channels .DatagramAdapter+DatagramAdapterListener Base<TChannel,TSessionChannel,ItemType >+IWaiter
IMergeEnabledMessageProperty 1 1 type 1 method System.ServiceModel.Channels .IMergeEnabledMessageProperty
IBufferedMessageData 0.27 10 types 9 methods System.ServiceModel.Channels .IBufferedMessageData
ICompressedMessageEncoder 0.67 4 types 3 methods System.ServiceModel.Channels .ICompressedMessageEncoder
ITransportCompressionSupport 0.33 3 types 1 method System.ServiceModel.Channels .ITransportCompressionSupport
IPeerNeighbor 0.11 18 types 18 methods System.ServiceModel.Channels .IPeerNeighbor
IPeerFactory 0.28 4 types 8 methods System.ServiceModel.Channels .IPeerFactory
IFlooderForThrottle 0.5 1 type 2 methods System.ServiceModel.Channels .IFlooderForThrottle
IPeerMaintainer 1 1 type 17 methods System.ServiceModel.Channels .IPeerMaintainer
IConnectAlgorithms 1 1 type 4 methods System.ServiceModel.Channels .IConnectAlgorithms
IPeerNodeMessageHandling 0.071 6 types 7 methods System.ServiceModel.Channels .IPeerNodeMessageHandling
IPeerConnectorContract 0.5 2 types 4 methods System.ServiceModel.Channels .IPeerConnectorContract
IPeerFlooderContract<TFloodContract ,TLinkContract> 0.5 2 types 3 methods System.ServiceModel.Channels .IPeerFlooderContract<TFloodContract ,TLinkContract>
IPeerServiceContract 0.2 1 type 10 methods System.ServiceModel.Channels .IPeerServiceContract
ITransactionChannel 0.25 1 type 4 methods System.ServiceModel.Channels .ITransactionChannel
WSTrustDec2005+DriverDec2005+IWsTrustDec 2005SecurityTokenService 0 2 types 1 method System.ServiceModel.Security .WSTrustDec2005+DriverDec2005+IWsTrustDe c2005SecurityTokenService
WSTrustFeb2005+DriverFeb2005+IWsTrustFeb 2005SecurityTokenService 0 2 types 1 method System.ServiceModel.Security .WSTrustFeb2005+DriverFeb2005+IWsTrustFe b2005SecurityTokenService
IChannelSecureConversationSessionSetting s 0 1 type 6 methods System.ServiceModel.Security .IChannelSecureConversationSessionSettin gs
IListenerSecureConversationSessionSettin gs 0 1 type 12 methods System.ServiceModel.Security .IListenerSecureConversationSessionSetti ngs
ISecurityCommunicationObject 1 1 type 14 methods System.ServiceModel.Security .ISecurityCommunicationObject
TimeBoundedCache+IExpirableItem 0.5 4 types 1 method System.ServiceModel.Security .TimeBoundedCache+IExpirableItem
ISecurityContextSecurityTokenCacheProvid er 1 2 types 1 method System.ServiceModel.Security.Tokens .ISecurityContextSecurityTokenCacheProvi der
IAspNetMessageProperty 0.17 6 types 4 methods System.ServiceModel.Activation .IAspNetMessageProperty
IConnectionDuplicator 1 1 type 2 methods System.ServiceModel.Activation .IConnectionDuplicator
IConnectionRegister 0.67 1 type 3 methods System.ServiceModel.Activation .IConnectionRegister
IConnectionRegisterAsync 0.5 2 types 2 methods System.ServiceModel.Activation .IConnectionRegisterAsync
ListenerUnsafeNativeMethods+ICorRuntimeH ost 0.045 2 types 11 methods System.ServiceModel.Activation .ListenerUnsafeNativeMethods+ICorRuntime Host
IAnnouncementInnerClient 0.25 4 types 19 methods System.ServiceModel.Discovery .IAnnouncementInnerClient
IAnnouncementServiceImplementation 0 6 types 5 methods System.ServiceModel.Discovery .IAnnouncementServiceImplementation
IDiscoveryInnerClient 0.25 4 types 12 methods System.ServiceModel.Discovery .IDiscoveryInnerClient
IDiscoveryInnerClientResponse 0.42 8 types 5 methods System.ServiceModel.Discovery .IDiscoveryInnerClientResponse
IDiscoveryServiceImplementation 0 10 types 6 methods System.ServiceModel.Discovery .IDiscoveryServiceImplementation
IDiscoveryVersionImplementation 0.14 10 types 11 methods System.ServiceModel.Discovery .IDiscoveryVersionImplementation
IMulticastSuppressionImplementation 0 6 types 4 methods System.ServiceModel.Discovery .IMulticastSuppressionImplementation
IAnnouncementContractCD1 0.5 2 types 6 methods System.ServiceModel.Discovery.VersionCD1 .IAnnouncementContractCD1
IDiscoveryContractAdhocCD1 0.33 3 types 6 methods System.ServiceModel.Discovery.VersionCD1 .IDiscoveryContractAdhocCD1
IDiscoveryContractManagedCD1 0.5 2 types 6 methods System.ServiceModel.Discovery.VersionCD1 .IDiscoveryContractManagedCD1
IDiscoveryResponseContractCD1 0.67 2 types 6 methods System.ServiceModel.Discovery.VersionCD1 .IDiscoveryResponseContractCD1
IAnnouncementContractApril2005 0.5 2 types 6 methods System.ServiceModel.Discovery .VersionApril2005 .IAnnouncementContractApril2005
IDiscoveryContractApril2005 1 1 type 6 methods System.ServiceModel.Discovery .VersionApril2005 .IDiscoveryContractApril2005
IDiscoveryResponseContractApril2005 0.67 2 types 6 methods System.ServiceModel.Discovery .VersionApril2005 .IDiscoveryResponseContractApril2005
IAnnouncementContract11 0.5 2 types 6 methods System.ServiceModel.Discovery.Version11 .IAnnouncementContract11
IDiscoveryContractAdhoc11 0.33 3 types 6 methods System.ServiceModel.Discovery.Version11 .IDiscoveryContractAdhoc11
IDiscoveryContractManaged11 0.5 2 types 6 methods System.ServiceModel.Discovery.Version11 .IDiscoveryContractManaged11
IDiscoveryResponseContract11 0.67 2 types 6 methods System.ServiceModel.Discovery.Version11 .IDiscoveryResponseContract11
IUdpReceiveHandler 1 1 type 3 methods System.ServiceModel.Channels .IUdpReceiveHandler
IServiceModelActivationHandler 0.5 2 types 1 method System.ServiceModel.Activation .IServiceModelActivationHandler
IMSAdminBase 0.097 1 type 31 methods System.ServiceModel.Activation .IMSAdminBase
ICanonicalizableNode 0.33 3 types 4 methods System.Security.Cryptography.Xml .ICanonicalizableNode
IStorageFolderHandleAccess 1 1 type 1 method System.IO.IStorageFolderHandleAccess
IStorageItemHandleAccess 1 1 type 1 method System.IO.IStorageItemHandleAccess
IDispatcherQueue 0.17 2 types 3 methods System.Threading.IDispatcherQueue
IBufferByteAccess 1 1 type 1 method System.Runtime.InteropServices .WindowsRuntime.IBufferByteAccess
IRestrictedErrorInfo 1 1 type 2 methods System.Runtime.InteropServices .WindowsRuntime.IRestrictedErrorInfo
ISerParser 0.5 2 types 1 method System.Runtime.Serialization.Formatters .Soap.ISerParser
IDataNode 0.15 10 types 18 methods System.Runtime.Serialization.IDataNode
IGenericNameProvider 0 2 types 6 methods System.Runtime.Serialization .IGenericNameProvider
IByteBufferPool 0.23 15 types 2 methods System.IO.IByteBufferPool
WsdlParser+IDump 1 1 type 1 method System.Runtime.Remoting.MetadataServices .WsdlParser+IDump
WsdlParser+INamespaces 0 1 type 1 method System.Runtime.Remoting.MetadataServices .WsdlParser+INamespaces
ICancelable 1 1 type 1 method System.Runtime.ICancelable
IPersistencePipelineModule 0.16 8 types 11 methods System.Runtime .IPersistencePipelineModule
IDurableInstancingOptions 1 1 type 1 method System.Runtime.DurableInstancing .IDurableInstancingOptions
IPersistStream 0 2 types 5 methods System.Messaging.Interop.IPersistStream
IPersistStreamInit 0.17 1 type 6 methods System.Messaging.Interop .IPersistStreamInit
IStream 0 2 types 11 methods System.Messaging.Interop.IStream
ITransaction 0.17 4 types 3 methods System.Messaging.Interop.ITransaction
IWbemPathKeyList 0.2 1 type 10 methods WmiNative.IWbemPathKeyList
IWbemPath 0.15 1 type 26 methods WmiNative.IWbemPath
IWbemDecoupledRegistrar 1 1 type 2 methods WmiNative.IWbemDecoupledRegistrar
IWbemServices 0.043 1 type 23 methods WmiNative.IWbemServices
IWbemClassObject 0.065 7 types 24 methods WmiNative.IWbemClassObject
IWbemContext 0 4 types 9 methods WmiNative.IWbemContext
IWbemProviderInitSink 0.5 2 types 1 method WmiNative.IWbemProviderInitSink
IWbemObjectSink 0.33 3 types 2 methods WmiNative.IWbemObjectSink
IEnumWbemClassObject 0 2 types 5 methods WmiNative.IEnumWbemClassObject
IWbemQualifierSet 0.14 1 type 7 methods WmiNative.IWbemQualifierSet
ICIMResultHandler 0.2 3 types 5 methods System.Management.Instrumentation .ICIMResultHandler
ICIMQuery 0 1 type 1 method System.Management.Instrumentation .ICIMQuery
ICIMEnumerate 0.5 2 types 1 method System.Management.Instrumentation .ICIMEnumerate
ICIMGet 0.5 2 types 1 method System.Management.Instrumentation .ICIMGet
ICIMDelete 0.5 2 types 1 method System.Management.Instrumentation .ICIMDelete
ICIMUpdate 0.5 2 types 1 method System.Management.Instrumentation .ICIMUpdate
ICIMExecute 0.5 2 types 1 method System.Management.Instrumentation .ICIMExecute
ICIMCapabilities 0.83 1 type 6 methods System.Management.Instrumentation .ICIMCapabilities
IWbemClassObject_DoNotMarshal 0 5 types 24 methods System.Management .IWbemClassObject_DoNotMarshal
IWbemLocator 0 1 type 1 method System.Management.IWbemLocator
IWbemContext 0.014 16 types 9 methods System.Management.IWbemContext
IWbemServices 0.041 19 types 23 methods System.Management.IWbemServices
IWbemCallResult 0.5 1 type 4 methods System.Management.IWbemCallResult
IWbemObjectSink 0.11 9 types 2 methods System.Management.IWbemObjectSink
IEnumWbemClassObject 0.053 15 types 5 methods System.Management.IEnumWbemClassObject
IWbemObjectTextSrc 0.5 1 type 2 methods System.Management.IWbemObjectTextSrc
IWbemStatusCodeText 0.5 1 type 2 methods System.Management.IWbemStatusCodeText
IWbemProviderInitSink 1 1 type 1 method System.Management.IWbemProviderInitSink
IWbemDecoupledRegistrar 1 1 type 2 methods System.Management .IWbemDecoupledRegistrar
IWbemPathKeyList 0.2 1 type 10 methods System.Management.IWbemPathKeyList
IWbemPath 0.46 1 type 26 methods System.Management.IWbemPath
IMetaDataDispenser 0.33 1 type 3 methods System.Management.Instrumentation .IMetaDataDispenser
IMetaDataImportInternalOnly 0.12 1 type 8 methods System.Management.Instrumentation .IMetaDataImportInternalOnly
ILog 1 1 type 7 methods System.IO.Log.ILog
IFileBasedLogInit 1 1 type 1 method System.IO.Log.IFileBasedLogInit
ISspiNegotiation 0.1 11 types 8 methods System.ServiceModel.Security .ISspiNegotiation
ISspiNegotiationInfo 1 1 type 1 method System.ServiceModel.Security .ISspiNegotiationInfo
IPrefixGenerator 0 2 types 1 method System.IdentityModel.IPrefixGenerator
ISecurityElement 0.29 7 types 3 methods System.IdentityModel.ISecurityElement
ISignatureValueSecurityElement 0 5 types 1 method System.IdentityModel .ISignatureValueSecurityElement
ICanonicalWriterEndRootElementCallback 1 1 type 1 method System.IdentityModel .ICanonicalWriterEndRootElementCallback
IIdentityInfo 1 1 type 1 method System.IdentityModel.Policy .IIdentityInfo
IClrStrongNameUsingIntPtr 0.24 1 type 25 methods Microsoft.Runtime.Hosting .IClrStrongNameUsingIntPtr
IClrStrongName 0.36 1 type 25 methods Microsoft.Runtime.Hosting.IClrStrongName
IGetContextProperties 0.33 1 type 3 methods System.EnterpriseServices .IGetContextProperties
IContextProperties 0.2 1 type 5 methods System.EnterpriseServices .IContextProperties
IObjectConstruct 0 1 type 1 method System.EnterpriseServices .IObjectConstruct
IObjectConstructString 1 2 types 1 method System.EnterpriseServices .IObjectConstructString
IObjectContext 0.12 2 types 8 methods System.EnterpriseServices.IObjectContext
IObjectContextInfo 0.4 1 type 5 methods System.EnterpriseServices .IObjectContextInfo
IObjectContextInfo2 0.38 1 type 8 methods System.EnterpriseServices .IObjectContextInfo2
IObjectControl 0 2 types 3 methods System.EnterpriseServices.IObjectControl
ITransactionProxy 0 1 type 7 methods System.EnterpriseServices .ITransactionProxy
ITransactionVoterBallotAsync2 0 1 type 1 method System.EnterpriseServices .ITransactionVoterBallotAsync2
ITransactionVoterNotifyAsync2 0.4 2 types 5 methods System.EnterpriseServices .ITransactionVoterNotifyAsync2
ISharedProperty 0.5 2 types 2 methods System.EnterpriseServices .ISharedProperty
ISharedPropertyGroup 0.5 2 types 4 methods System.EnterpriseServices .ISharedPropertyGroup
ISharedPropertyGroupManager 1 1 type 3 methods System.EnterpriseServices .ISharedPropertyGroupManager
IManagedObject 0 3 types 2 methods System.EnterpriseServices.IManagedObject
IContext 0.33 1 type 3 methods System.EnterpriseServices.IContext
IManagedObjectInfo 0 1 type 4 methods System.EnterpriseServices .IManagedObjectInfo
ITransactionProperty 0.077 1 type 13 methods System.EnterpriseServices .ITransactionProperty
ISecurityCallersColl 0.5 2 types 3 methods System.EnterpriseServices .ISecurityCallersColl
ISecurityIdentityColl 0.11 3 types 3 methods System.EnterpriseServices .ISecurityIdentityColl
ISecurityCallContext 0.33 2 types 6 methods System.EnterpriseServices .ISecurityCallContext
IConfigurationAttribute 0.83 2 types 3 methods System.EnterpriseServices .IConfigurationAttribute
ICreateTypeLib 0.1 1 type 10 methods System.EnterpriseServices.ICreateTypeLib
IConfigCallback 1 1 type 6 methods System.EnterpriseServices .IConfigCallback
ITransactionResourcePool 1 1 type 2 methods System.EnterpriseServices .ITransactionResourcePool
ICreateWithTipTransactionEx 1 1 type 1 method System.EnterpriseServices .ICreateWithTipTransactionEx
ICreateWithTransactionEx 1 1 type 1 method System.EnterpriseServices .ICreateWithTransactionEx
ICreateWithLocalTransaction 1 1 type 1 method System.EnterpriseServices .ICreateWithLocalTransaction
IAssemblyCache 0.4 1 type 5 methods System.EnterpriseServices.Internal .IAssemblyCache
ITypeLib2 0.071 1 type 14 methods System.EnterpriseServices.Internal .ITypeLib2
IFormatLogRecords 1 1 type 3 methods System.EnterpriseServices .CompensatingResourceManager .IFormatLogRecords
_IMonitorClerks 0.43 2 types 7 methods System.EnterpriseServices .CompensatingResourceManager ._IMonitorClerks
ICatalog 0.12 1 type 26 methods System.EnterpriseServices.Admin.ICatalog
ICatalogObject 0.21 29 types 7 methods System.EnterpriseServices.Admin .ICatalogObject
ICatalogCollection 0.26 7 types 16 methods System.EnterpriseServices.Admin .ICatalogCollection
IThunkInstallation 1 1 type 1 method System.EnterpriseServices.Thunk .IThunkInstallation
IProxyInvoke 0.5 1 type 2 methods System.EnterpriseServices.Thunk .IProxyInvoke
IDispatch 0.21 6 types 4 methods System.Dynamic.IDispatch
IProvideClassInfo 1 1 type 1 method System.Dynamic.IProvideClassInfo
ISystemColorTracker 1 1 type 1 method System.Drawing.Internal .ISystemColorTracker
UnsafeNativeMethods+IMarshal 0 1 type 6 methods Microsoft.Win32 .UnsafeNativeMethods+IMarshal
IInternetSecurityManager 0.12 2 types 8 methods Microsoft.Win32.IInternetSecurityManager
IAuthenticationManager 1 1 type 14 methods System.Net.IAuthenticationManager
IWebProxyFinder 1 1 type 4 methods System.Net.IWebProxyFinder
IRequestLifetimeTracker 1 1 type 1 method System.Net.IRequestLifetimeTracker
ISessionAuthenticationModule 0.67 1 type 3 methods System.Net.ISessionAuthenticationModule
ICloseEx 1 6 types 1 method System.Net.ICloseEx
SSPIInterface 0.2 5 types 21 methods System.Net.SSPIInterface
IAutoWebProxy 1 1 type 1 method System.Net.IAutoWebProxy
IEncodableStream 0.42 3 types 4 methods System.Net.Mime.IEncodableStream
IMSAdminBase 0.13 1 type 31 methods System.Net.Mail.IMSAdminBase
ISmtpAuthenticationModule 0.4 5 types 3 methods System.Net.Mail .ISmtpAuthenticationModule
INotifyCollectionChangedEventArgs 1 1 type 5 methods System.Runtime.InteropServices .WindowsRuntime .INotifyCollectionChangedEventArgs
IPropertyChangedEventArgs 1 1 type 1 method System.Runtime.InteropServices .WindowsRuntime .IPropertyChangedEventArgs
INotifyCollectionChanged_WinRT 1 1 type 2 methods System.Runtime.InteropServices .WindowsRuntime .INotifyCollectionChanged_WinRT
INotifyPropertyChanged_WinRT 1 1 type 2 methods System.Runtime.InteropServices .WindowsRuntime .INotifyPropertyChanged_WinRT
ICommand_WinRT 1 1 type 4 methods System.Runtime.InteropServices .WindowsRuntime.ICommand_WinRT
IDeflater 1 1 type 4 methods System.IO.Compression.IDeflater
IInflater 0.6 1 type 5 methods System.IO.Compression.IInflater
IFileFormatWriter 0.5 2 types 3 methods System.IO.Compression.IFileFormatWriter
IFileFormatReader 0.33 3 types 4 methods System.IO.Compression.IFileFormatReader
NativeComInterfaces+IAdsPathname 0.21 7 types 11 methods System.DirectoryServices.ActiveDirectory .NativeComInterfaces+IAdsPathname
NativeComInterfaces+IAdsProperty 0.042 2 types 24 methods System.DirectoryServices.ActiveDirectory .NativeComInterfaces+IAdsProperty
NativeComInterfaces+IAdsClass 0.058 2 types 43 methods System.DirectoryServices.ActiveDirectory .NativeComInterfaces+IAdsClass
ILocationReport 0.67 1 type 3 methods System.Device.Location.Internal .ILocationReport
ILatLongReport 0.62 1 type 8 methods System.Device.Location.Internal .ILatLongReport
ILocation 0.67 1 type 9 methods System.Device.Location.Internal .ILocation
IWizardStepEditableRegion 1 2 types 1 method System.Web.UI.Design.WebControls .IWizardStepEditableRegion
IDesignConnection 0.046 14 types 14 methods System.Data.Design.IDesignConnection
IDataSourceNamedObject 0 5 types 1 method System.Data.Design .IDataSourceNamedObject
IDataSourceXmlSerializable 1 1 type 2 methods System.Data.Design .IDataSourceXmlSerializable
IDataSourceXmlSpecialOwner 1 1 type 2 methods System.Data.Design .IDataSourceXmlSpecialOwner
IDataSourceInitAfterLoading 1 1 type 1 method System.Data.Design .IDataSourceInitAfterLoading
INamedObject 0.5 4 types 2 methods System.Data.Design.INamedObject
INamedObjectCollection 0 3 types 1 method System.Data.Design .INamedObjectCollection
INameService 0.083 8 types 6 methods System.Data.Design.INameService
IEventHandlerService 0.18 11 types 6 methods System.Windows.Forms.Design .IEventHandlerService
IMenuStatusHandler 1 1 type 2 methods System.Windows.Forms.Design .IMenuStatusHandler
IMouseHandler 0.5 2 types 6 methods System.Windows.Forms.Design .IMouseHandler
IOleDragClient 0.33 4 types 6 methods System.Windows.Forms.Design .IOleDragClient
IOverlayService 0.32 5 types 5 methods System.Windows.Forms.Design .IOverlayService
ISelectionUIHandler 0.5 2 types 13 methods System.Windows.Forms.Design .ISelectionUIHandler
ISelectionUIService 0.11 5 types 20 methods System.Windows.Forms.Design .ISelectionUIService
ISplitWindowService 0.5 2 types 2 methods System.Windows.Forms.Design .ISplitWindowService
ISupportInSituService 0.33 3 types 3 methods System.Windows.Forms.Design .ISupportInSituService
IClrStrongNameUsingIntPtr 0.24 1 type 25 methods Microsoft.Runtime.Hosting .IClrStrongNameUsingIntPtr
IClrStrongName 0.36 1 type 25 methods Microsoft.Runtime.Hosting.IClrStrongName
IEnumSTORE_ASSEMBLY_INSTALLATION_REFEREN CE 0 1 type 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_INSTALLATION_REFERE NCE
IEnumSTORE_DEPLOYMENT_METADATA 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA
IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY
IEnumSTORE_ASSEMBLY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY
IEnumSTORE_ASSEMBLY_FILE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_FILE
IEnumSTORE_CATEGORY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY
IEnumSTORE_CATEGORY_SUBCATEGORY 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_SUBCATEGORY
IEnumSTORE_CATEGORY_INSTANCE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_INSTANCE
IReferenceIdentity 0.12 13 types 4 methods System.Deployment.Internal.Isolation .IReferenceIdentity
IDefinitionIdentity 0.083 18 types 4 methods System.Deployment.Internal.Isolation .IDefinitionIdentity
IEnumIDENTITY_ATTRIBUTE 0.2 2 types 5 methods System.Deployment.Internal.Isolation .IEnumIDENTITY_ATTRIBUTE
IEnumDefinitionIdentity 0.25 4 types 4 methods System.Deployment.Internal.Isolation .IEnumDefinitionIdentity
IEnumReferenceIdentity 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumReferenceIdentity
IDefinitionAppId 0.083 20 types 6 methods System.Deployment.Internal.Isolation .IDefinitionAppId
IReferenceAppId 0.2 5 types 5 methods System.Deployment.Internal.Isolation .IReferenceAppId
IIdentityAuthority 0.22 3 types 18 methods System.Deployment.Internal.Isolation .IIdentityAuthority
IAppIdAuthority 0.16 2 types 16 methods System.Deployment.Internal.Isolation .IAppIdAuthority
IStore 0.19 5 types 20 methods System.Deployment.Internal.Isolation .IStore
IManifestParseErrorCallback 0 2 types 1 method System.Deployment.Internal.Isolation .IManifestParseErrorCallback
IManifestInformation 0.5 2 types 1 method System.Deployment.Internal.Isolation .IManifestInformation
IActContext 0.22 3 types 18 methods System.Deployment.Internal.Isolation .IActContext
IStateManager 0.25 1 type 4 methods System.Deployment.Internal.Isolation .IStateManager
ISection 0.21 7 types 4 methods System.Deployment.Internal.Isolation .ISection
ISectionWithStringKey 0.5 1 type 2 methods System.Deployment.Internal.Isolation .ISectionWithStringKey
ISectionWithReferenceIdentityKey 1 1 type 1 method System.Deployment.Internal.Isolation .ISectionWithReferenceIdentityKey
ISectionEntry 0 1 type 2 methods System.Deployment.Internal.Isolation .ISectionEntry
IEnumUnknown 0.25 3 types 4 methods System.Deployment.Internal.Isolation .IEnumUnknown
ICMS 0.064 5 types 22 methods System.Deployment.Internal.Isolation .Manifest.ICMS
IHashElementEntry 0.14 2 types 7 methods System.Deployment.Internal.Isolation .Manifest.IHashElementEntry
IFileEntry 0.067 1 type 15 methods System.Deployment.Internal.Isolation .Manifest.IFileEntry
IFileAssociationEntry 0.17 1 type 6 methods System.Deployment.Internal.Isolation .Manifest.IFileAssociationEntry
IAssemblyReferenceEntry 0.25 1 type 4 methods System.Deployment.Internal.Isolation .Manifest.IAssemblyReferenceEntry
IEntryPointEntry 0.17 1 type 6 methods System.Deployment.Internal.Isolation .Manifest.IEntryPointEntry
IDescriptionMetadataEntry 0.14 1 type 7 methods System.Deployment.Internal.Isolation .Manifest.IDescriptionMetadataEntry
IDeploymentMetadataEntry 0.17 1 type 6 methods System.Deployment.Internal.Isolation .Manifest.IDeploymentMetadataEntry
IDependentOSMetadataEntry 0.12 1 type 8 methods System.Deployment.Internal.Isolation .Manifest.IDependentOSMetadataEntry
ICompatibleFrameworksMetadataEntry 0.5 1 type 2 methods System.Deployment.Internal.Isolation .Manifest .ICompatibleFrameworksMetadataEntry
IMetadataSectionEntry 0.33 1 type 21 methods System.Deployment.Internal.Isolation .Manifest.IMetadataSectionEntry
ICompatibleFrameworkEntry 0.2 1 type 5 methods System.Deployment.Internal.Isolation .Manifest.ICompatibleFrameworkEntry
IManagedDeploymentServiceCom 0 2 types 7 methods System.Deployment.Application .IManagedDeploymentServiceCom
IDownloadNotification 0 2 types 2 methods System.Deployment.Application .IDownloadNotification
IMetaDataDispenser 0.33 1 type 3 methods System.Deployment.Application .IMetaDataDispenser
IMetaDataImport 0 1 type 62 methods System.Deployment.Application .IMetaDataImport
IMetaDataAssemblyImport 0.5 1 type 14 methods System.Deployment.Application .IMetaDataAssemblyImport
NativeMethods+IAssemblyCache 0.05 4 types 5 methods System.Deployment.Application .NativeMethods+IAssemblyCache
NativeMethods+IAssemblyEnum 0.17 2 types 3 methods System.Deployment.Application .NativeMethods+IAssemblyEnum
NativeMethods+IApplicationContext 0 2 types 5 methods System.Deployment.Application .NativeMethods+IApplicationContext
NativeMethods+IAssemblyName 0 2 types 9 methods System.Deployment.Application .NativeMethods+IAssemblyName
NativeMethods+ICorRuntimeHost 0.026 2 types 19 methods System.Deployment.Application .NativeMethods+ICorRuntimeHost
ISourceLineInfo 0.22 18 types 4 methods System.Xml.Xsl.ISourceLineInfo
IErrorHelper 0.38 4 types 2 methods System.Xml.Xsl.IErrorHelper
IXPathBuilder<Node> 0.6 3 types 10 methods System.Xml.Xsl.XPath.IXPathBuilder<Node>
IFocus 0.5 2 types 3 methods System.Xml.Xsl.XPath.IFocus
IXPathEnvironment 0.38 2 types 4 methods System.Xml.Xsl.XPath.IXPathEnvironment
IQilAnnotation 1 1 type 1 method System.Xml.Xsl.Qil.IQilAnnotation
RecordOutput 0.2 5 types 2 methods System.Xml.Xsl.XsltOld.RecordOutput
IStackFrame 0 1 type 5 methods System.Xml.Xsl.XsltOld.Debugger .IStackFrame
IXsltProcessor 0 1 type 2 methods System.Xml.Xsl.XsltOld.Debugger .IXsltProcessor
IXsltDebugger 0.12 8 types 3 methods System.Xml.Xsl.XsltOld.Debugger .IXsltDebugger
IDataService 0.12 28 types 15 methods System.Data.Services.IDataService
IProjectedResult 0.5 2 types 2 methods System.Data.Services.IProjectedResult
OperationSignatures+ILogicalSignatures 0 2 types 3 methods System.Data.Services.Parsing .OperationSignatures+ILogicalSignatures
OperationSignatures+IArithmeticSignature s 0 2 types 11 methods System.Data.Services.Parsing .OperationSignatures+IArithmeticSignatur es
OperationSignatures+IRelationalSignature s 0 2 types 9 methods System.Data.Services.Parsing .OperationSignatures+IRelationalSignatur es
OperationSignatures+INegationSignatures 0 2 types 11 methods System.Data.Services.Parsing .OperationSignatures+INegationSignatures
OperationSignatures+INotSignatures 0 2 types 3 methods System.Data.Services.Parsing .OperationSignatures+INotSignatures
OperationSignatures+IEnumerableSignature s 0 1 type 28 methods System.Data.Services.Parsing .OperationSignatures+IEnumerableSignatur es
IExceptionWriter 0.5 2 types 1 method System.Data.Services.Serializers .IExceptionWriter
IProjectionProvider 0.5 2 types 1 method System.Data.Services.Providers .IProjectionProvider
IDataServices 0.21 8 types 7 methods System.Data.Linq.Provider.IDataServices
IDeferredSourceFactory 0.25 2 types 2 methods System.Data.Linq.Provider .IDeferredSourceFactory
IProvider 0.14 10 types 18 methods System.Data.Linq.Provider.IProvider
ICompiledQuery 0.67 3 types 1 method System.Data.Linq.Provider.ICompiledQuery
IConnectionManager 0.25 2 types 2 methods System.Data.Linq.SqlClient .IConnectionManager
IConnectionUser 1 1 type 1 method System.Data.Linq.SqlClient .IConnectionUser
IObjectReader 0.33 3 types 1 method System.Data.Linq.SqlClient.IObjectReader
IObjectReaderSession 0.17 6 types 2 methods System.Data.Linq.SqlClient .IObjectReaderSession
IReaderProvider 0.17 3 types 2 methods System.Data.Linq.SqlClient .IReaderProvider
IObjectReaderFactory 0.14 7 types 2 methods System.Data.Linq.SqlClient .IObjectReaderFactory
IObjectReaderCompiler 1 1 type 2 methods System.Data.Linq.SqlClient .IObjectReaderCompiler
ICompiledSubQuery 0 6 types 1 method System.Data.Linq.SqlClient .ICompiledSubQuery
IEntityStateManager 0.3 4 types 5 methods System.Data.IEntityStateManager
IEntityStateEntry 0.11 25 types 14 methods System.Data.IEntityStateEntry
IEntityAdapter 0.33 3 types 7 methods System.Data.IEntityAdapter
ISqlFragment 0.33 3 types 1 method System.Data.SqlClient.SqlGen .ISqlFragment
IDbSpatialValue 0.5 4 types 8 methods System.Data.SqlClient.Internal .IDbSpatialValue
IObjectView 1 1 type 2 methods System.Data.Objects.IObjectView
IObjectViewData<T> 0.33 3 types 13 methods System.Data.Objects.IObjectViewData<T>
IChangeTrackingStrategy 0 4 types 4 methods System.Data.Objects.Internal .IChangeTrackingStrategy
IEntityKeyStrategy 0 4 types 3 methods System.Data.Objects.Internal .IEntityKeyStrategy
IPropertyAccessorStrategy 0 4 types 5 methods System.Data.Objects.Internal .IPropertyAccessorStrategy
IEntityWrapper 0.13 21 types 29 methods System.Data.Objects.Internal .IEntityWrapper
IRelationshipFixer 0.33 3 types 1 method System.Data.Objects.DataClasses .IRelationshipFixer
IBaseList<T> 0.18 19 types 3 methods System.Data.Metadata.Edm.IBaseList<T>
ITileQuery 1 1 type 1 method System.Data.Mapping.ViewGeneration .QueryRewriting.ITileQuery
IRelationship 0.24 9 types 7 methods System.Data.EntityModel .SchemaObjectModel.IRelationship
IRelationshipEnd 0.3 10 types 5 methods System.Data.EntityModel .SchemaObjectModel.IRelationshipEnd
ISchemaElementLookUpTable<T> 0.25 4 types 5 methods System.Data.EntityModel .SchemaObjectModel .ISchemaElementLookUpTable<T>
IGroupExpressionExtendedInfo 1 1 type 2 methods System.Data.Common.EntitySql .IGroupExpressionExtendedInfo
IGetAlternativeName 1 1 type 1 method System.Data.Common.EntitySql .IGetAlternativeName
ITypedGetters 0 3 types 35 methods Microsoft.SqlServer.Server.ITypedGetters
ITypedGettersV3 0.11 10 types 17 methods Microsoft.SqlServer.Server .ITypedGettersV3
ITypedSettersV3 0.2 5 types 17 methods Microsoft.SqlServer.Server .ITypedSettersV3
IXmlDataVirtualNode 0.75 1 type 4 methods System.Xml.IXmlDataVirtualNode
IFilter 0.11 9 types 1 method System.Data.IFilter
NativeMethods+ISourcesRowset 0.5 2 types 1 method System.Data.Common .NativeMethods+ISourcesRowset
NativeMethods+ITransactionJoin 0.17 3 types 2 methods System.Data.Common .NativeMethods+ITransactionJoin
UnsafeNativeMethods+ADORecordConstructio n 0.5 2 types 1 method System.Data.Common .UnsafeNativeMethods+ADORecordConstructi on
UnsafeNativeMethods+ADORecordsetConstruc tion 0.33 2 types 3 methods System.Data.Common .UnsafeNativeMethods+ADORecordsetConstru ction
UnsafeNativeMethods+Recordset15 0.027 2 types 55 methods System.Data.Common .UnsafeNativeMethods+Recordset15
UnsafeNativeMethods+_ADORecord 0.031 2 types 16 methods System.Data.Common .UnsafeNativeMethods+_ADORecord
UnsafeNativeMethods+IAccessor 0.1 5 types 4 methods System.Data.Common .UnsafeNativeMethods+IAccessor
UnsafeNativeMethods+IChapteredRowset 0.25 2 types 2 methods System.Data.Common .UnsafeNativeMethods+IChapteredRowset
UnsafeNativeMethods+IColumnsInfo 0.33 3 types 1 method System.Data.Common .UnsafeNativeMethods+IColumnsInfo
UnsafeNativeMethods+IColumnsRowset 0.33 3 types 2 methods System.Data.Common .UnsafeNativeMethods+IColumnsRowset
UnsafeNativeMethods+ICommandPrepare 0.5 2 types 1 method System.Data.Common .UnsafeNativeMethods+ICommandPrepare
UnsafeNativeMethods+ICommandProperties 0.33 3 types 2 methods System.Data.Common .UnsafeNativeMethods+ICommandProperties
UnsafeNativeMethods+ICommandText 0.15 4 types 5 methods System.Data.Common .UnsafeNativeMethods+ICommandText
UnsafeNativeMethods+ICommandWithParamete rs 0.17 2 types 3 methods System.Data.Common .UnsafeNativeMethods+ICommandWithParamet ers
UnsafeNativeMethods+IDBInfo 0.25 4 types 2 methods System.Data.Common .UnsafeNativeMethods+IDBInfo
UnsafeNativeMethods+IDBProperties 0.14 7 types 3 methods System.Data.Common .UnsafeNativeMethods+IDBProperties
UnsafeNativeMethods+IDBSchemaRowset 0.2 5 types 2 methods System.Data.Common .UnsafeNativeMethods+IDBSchemaRowset
UnsafeNativeMethods+IErrorInfo 0.21 8 types 3 methods System.Data.Common .UnsafeNativeMethods+IErrorInfo
UnsafeNativeMethods+IErrorRecords 0.17 3 types 6 methods System.Data.Common .UnsafeNativeMethods+IErrorRecords
UnsafeNativeMethods+IMultipleResults 0.33 3 types 1 method System.Data.Common .UnsafeNativeMethods+IMultipleResults
UnsafeNativeMethods+IOpenRowset 0.33 3 types 1 method System.Data.Common .UnsafeNativeMethods+IOpenRowset
UnsafeNativeMethods+IRow 0.5 2 types 1 method System.Data.Common .UnsafeNativeMethods+IRow
UnsafeNativeMethods+IRowset 0.2 3 types 5 methods System.Data.Common .UnsafeNativeMethods+IRowset
UnsafeNativeMethods+IRowsetInfo 0.33 3 types 2 methods System.Data.Common .UnsafeNativeMethods+IRowsetInfo
UnsafeNativeMethods+ISQLErrorInfo 0.5 2 types 1 method System.Data.Common .UnsafeNativeMethods+ISQLErrorInfo
UnsafeNativeMethods+ITransactionLocal 0.05 4 types 5 methods System.Data.Common .UnsafeNativeMethods+ITransactionLocal
ICngSymmetricAlgorithm 1 1 type 13 methods Internal.Cryptography .ICngSymmetricAlgorithm
IIListProvider<TElement> 0.33 1 type 3 methods System.Linq.IIListProvider<TElement>
IParallelPartitionable<T> 1 1 type 1 method System.Linq.Parallel .IParallelPartitionable<T>
IMergeHelper<TInputOutput> 1 1 type 3 methods System.Linq.Parallel.IMergeHelper <TInputOutput>
IPartitionedStreamRecipient<TElement> 0.94 34 types 1 method System.Linq.Parallel .IPartitionedStreamRecipient<TElement>
IAttributedImport 0.33 3 types 6 methods System.ComponentModel.Composition .IAttributedImport
IReflectionPartCreationInfo 0.33 3 types 8 methods System.ComponentModel.Composition .ReflectionModel .IReflectionPartCreationInfo
IPartCreatorImportDefinition 1 5 types 1 method System.ComponentModel.Composition .Primitives.IPartCreatorImportDefinition
FilteredCatalog+IComposablePartCatalogTr aversal 1 1 type 2 methods System.ComponentModel.Composition .Hosting .FilteredCatalog+IComposablePartCatalogT raversal
IActivityDelegateFactory 1 1 type 2 methods System.Activities.Presentation .IActivityDelegateFactory
IExpandChild 0 1 type 1 method System.Activities.Presentation .IExpandChild
IAutoSplitContainer 1 1 type 2 methods System.Activities.Presentation .FreeFormEditing.IAutoSplitContainer
INestedFreeFormPanelContainer 0.75 2 types 2 methods System.Activities.Presentation .FreeFormEditing .INestedFreeFormPanelContainer
IAutoConnectContainer 0.33 3 types 2 methods System.Activities.Presentation .FreeFormEditing.IAutoConnectContainer
IAnnotationVisualProvider 0.25 4 types 3 methods System.Activities.Presentation .Annotations.IAnnotationVisualProvider
IAnnotationIndicator 0.2 5 types 4 methods System.Activities.Presentation .Annotations.IAnnotationIndicator
IDockedAnnotation 0.25 4 types 5 methods System.Activities.Presentation .Annotations.IDockedAnnotation
IFloatingAnnotation 0.23 4 types 13 methods System.Activities.Presentation .Annotations.IFloatingAnnotation
IValidationErrorSourceLocator 0.33 3 types 2 methods System.Activities.Presentation .Validation .IValidationErrorSourceLocator
IItemsCollection 0.5 1 type 4 methods System.Activities.Presentation.Model .IItemsCollection
IModelTreeItem 0.14 27 types 12 methods System.Activities.Presentation.Model .IModelTreeItem
IPropertyViewManager 0.22 3 types 6 methods System.Activities.Presentation.Internal .PropertyEditing.Views .IPropertyViewManager
ISelectionPathInterpreter 1 1 type 2 methods System.Activities.Presentation.Internal .PropertyEditing.Selection .ISelectionPathInterpreter
ISelectionStop 0.27 6 types 5 methods System.Activities.Presentation.Internal .PropertyEditing.Selection .ISelectionStop
IStateContainer 1 1 type 2 methods System.Activities.Presentation.Internal .PropertyEditing.State.IStateContainer
IAutomationFocusChangedEventSource 1 2 types 1 method System.Activities.Presentation.Internal .PropertyEditing.Automation .IAutomationFocusChangedEventSource
IMessageLogger 0.22 3 types 3 methods System.Activities.Presentation.Internal .PropertyEditing.FromExpression .Framework.IMessageLogger
IIconProvider 1 1 type 1 method System.Activities.Presentation.Internal .PropertyEditing.FromExpression .Framework.ValueEditors.IIconProvider
IPropertyInspector 0.25 2 types 2 methods System.Activities.Presentation.Internal .PropertyEditing.FromExpression .Framework.PropertyInspector .IPropertyInspector
IVersionEditor 1 1 type 1 method System.Activities.Presentation.View .IVersionEditor
ITreeViewItemSelectionHandler 0.5 3 types 2 methods System.Activities.Presentation.View .TreeView.ITreeViewItemSelectionHandler
IWorkflowDesignerXamlHelperExecutionCont ext 1 1 type 10 methods Microsoft.Activities.Presentation.Xaml .IWorkflowDesignerXamlHelperExecutionCon text
ILoadRetryStrategy 0.5 2 types 1 method System.Activities.DurableInstancing .ILoadRetryStrategy
IObjectSerializer 0.35 5 types 4 methods System.Activities.DurableInstancing .IObjectSerializer
IAsyncCodeActivity 1 1 type 1 method System.Activities.IAsyncCodeActivity
IDynamicActivity 0.33 2 types 3 methods System.Activities.IDynamicActivity
ILocationReferenceExpression 1 1 type 1 method System.Activities.Expressions .ILocationReferenceExpression
ILocationReferenceWrapper 1 3 types 1 method System.Activities.Expressions .ILocationReferenceWrapper
DynamicUpdateMapBuilder+IDefinitionMatch er 0.25 4 types 4 methods System.Activities.DynamicUpdate .DynamicUpdateMapBuilder+IDefinitionMatc her
IInstanceUpdatable 1 1 type 1 method System.Activities.DynamicUpdate .IInstanceUpdatable
IFlowSwitch 1 1 type 2 methods System.Activities.Statements.IFlowSwitch
ICaseKeyBoxView 0.88 1 type 8 methods System.Activities.Core.Presentation .ICaseKeyBoxView
IFlowSwitchLink 0.33 2 types 9 methods System.Activities.Core.Presentation .IFlowSwitchLink
IFlowSwitchDefaultLink 1 1 type 2 methods System.Activities.Core.Presentation .IFlowSwitchDefaultLink
IActivationService 0.5 2 types 5 methods System.ServiceModel.Activation .IActivationService
IActivatedMessageQueue 0.33 3 types 9 methods System.ServiceModel.Activation .IActivatedMessageQueue
ICreateITypeLib 0.1 1 type 10 methods Microsoft.Tools.RegAsm.ICreateITypeLib
IAssemblyEnum 0.17 2 types 3 methods Microsoft.Win32.IAssemblyEnum
IApplicationContext 0 2 types 5 methods Microsoft.Win32.IApplicationContext
IAssemblyName 0.056 2 types 9 methods Microsoft.Win32.IAssemblyName
IClrStrongNameUsingIntPtr 0.24 1 type 25 methods Microsoft.Runtime.Hosting .IClrStrongNameUsingIntPtr
IClrStrongName 0.36 1 type 25 methods Microsoft.Runtime.Hosting.IClrStrongName
IAsyncCausalityTracerStatics 0.86 1 type 7 methods Windows.Foundation.Diagnostics .IAsyncCausalityTracerStatics
IWellKnownStringEqualityComparer 1 1 type 2 methods System.IWellKnownStringEqualityComparer
IRuntimeMethodInfo 0.24 21 types 1 method System.IRuntimeMethodInfo
IRuntimeFieldInfo 0.67 6 types 1 method System.IRuntimeFieldInfo
IResourceGroveler 1 1 type 2 methods System.Resources.IResourceGroveler
ISecurityElementFactory 0.5 2 types 4 methods System.Security.ISecurityElementFactory
IBuiltInPermission 1 1 type 1 method System.Security.Permissions .IBuiltInPermission
IUnionSemanticCodeGroup 0 1 type 1 method System.Security.Policy .IUnionSemanticCodeGroup
ILegacyEvidenceAdapter 1 1 type 2 methods System.Security.Policy .ILegacyEvidenceAdapter
IDelayEvaluatedEvidence 0.33 8 types 3 methods System.Security.Policy .IDelayEvaluatedEvidence
IReportMatchMembershipCondition 1 2 types 1 method System.Security.Policy .IReportMatchMembershipCondition
IRuntimeEvidenceFactory 0.5 2 types 3 methods System.Security.Policy .IRuntimeEvidenceFactory
Tokenizer+ITokenReader 1 1 type 1 method System.Security.Util .Tokenizer+ITokenReader
IAsyncLocal 0.11 9 types 1 method System.Threading.IAsyncLocal
IAsyncLocalValueMap 0.5 3 types 2 methods System.Threading.IAsyncLocalValueMap
IDeferredDisposable 1 1 type 1 method System.Threading.IDeferredDisposable
IThreadPoolWorkItem 0.12 8 types 2 methods System.Threading.IThreadPoolWorkItem
ITaskCompletionAction 0.67 3 types 1 method System.Threading.Tasks .ITaskCompletionAction
IProducerConsumerQueue<T> 0.25 4 types 5 methods System.Threading.Tasks .IProducerConsumerQueue<T>
ISection 0.083 6 types 4 methods System.Deployment.Internal.Isolation .ISection
ISectionWithStringKey 0.5 1 type 2 methods System.Deployment.Internal.Isolation .ISectionWithStringKey
ISectionWithReferenceIdentityKey 1 1 type 1 method System.Deployment.Internal.Isolation .ISectionWithReferenceIdentityKey
ISectionEntry 0 2 types 2 methods System.Deployment.Internal.Isolation .ISectionEntry
IEnumUnknown 0.25 1 type 4 methods System.Deployment.Internal.Isolation .IEnumUnknown
IEnumSTORE_ASSEMBLY_INSTALLATION_REFEREN CE 0 1 type 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_INSTALLATION_REFERE NCE
IEnumSTORE_DEPLOYMENT_METADATA 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA
IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_DEPLOYMENT_METADATA_PROPERTY
IEnumSTORE_ASSEMBLY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY
IEnumSTORE_ASSEMBLY_FILE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_ASSEMBLY_FILE
IEnumSTORE_CATEGORY 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY
IEnumSTORE_CATEGORY_SUBCATEGORY 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_SUBCATEGORY
IEnumSTORE_CATEGORY_INSTANCE 0.17 3 types 4 methods System.Deployment.Internal.Isolation .IEnumSTORE_CATEGORY_INSTANCE
IReferenceIdentity 0 5 types 4 methods System.Deployment.Internal.Isolation .IReferenceIdentity
IDefinitionIdentity 0.021 12 types 4 methods System.Deployment.Internal.Isolation .IDefinitionIdentity
IEnumDefinitionIdentity 0.25 2 types 4 methods System.Deployment.Internal.Isolation .IEnumDefinitionIdentity
IDefinitionAppId 0.046 18 types 6 methods System.Deployment.Internal.Isolation .IDefinitionAppId
IReferenceAppId 0 2 types 5 methods System.Deployment.Internal.Isolation .IReferenceAppId
IIdentityAuthority 0.028 2 types 18 methods System.Deployment.Internal.Isolation .IIdentityAuthority
IAppIdAuthority 0.062 4 types 16 methods System.Deployment.Internal.Isolation .IAppIdAuthority
IStore 0.19 5 types 20 methods System.Deployment.Internal.Isolation .IStore
IManifestParseErrorCallback 0 2 types 1 method System.Deployment.Internal.Isolation .IManifestParseErrorCallback
IManifestInformation 0.5 2 types 1 method System.Deployment.Internal.Isolation .IManifestInformation
IActContext 0.14 2 types 18 methods System.Deployment.Internal.Isolation .IActContext
ICMS 0.053 6 types 22 methods System.Deployment.Internal.Isolation .Manifest.ICMS
IAssemblyReferenceDependentAssemblyEntry 0.091 1 type 11 methods System.Deployment.Internal.Isolation .Manifest .IAssemblyReferenceDependentAssemblyEntr y
IAssemblyReferenceEntry 0.25 1 type 4 methods System.Deployment.Internal.Isolation .Manifest.IAssemblyReferenceEntry
IEntryPointEntry 0.17 1 type 6 methods System.Deployment.Internal.Isolation .Manifest.IEntryPointEntry
IPermissionSetEntry 0.33 1 type 3 methods System.Deployment.Internal.Isolation .Manifest.IPermissionSetEntry
IDescriptionMetadataEntry 0.14 1 type 7 methods System.Deployment.Internal.Isolation .Manifest.IDescriptionMetadataEntry
IMetadataSectionEntry 0.048 2 types 21 methods System.Deployment.Internal.Isolation .Manifest.IMetadataSectionEntry
IInternalMessage 0.27 8 types 7 methods System.Runtime.Remoting.Messaging .IInternalMessage
ISerializationRootObject 1 1 type 1 method System.Runtime.Remoting.Messaging .ISerializationRootObject
NativeMethods+IDispatch 0 2 types 4 methods System.Runtime.InteropServices .NativeMethods+IDispatch
IRestrictedErrorInfo 0 2 types 2 methods System.Runtime.InteropServices .WindowsRuntime.IRestrictedErrorInfo
IClosable 1 1 type 1 method System.Runtime.InteropServices .WindowsRuntime.IClosable
IStringable 1 2 types 1 method System.Runtime.InteropServices .WindowsRuntime.IStringable
IReference<T> 0 1 type 1 method System.Runtime.InteropServices .WindowsRuntime.IReference<T>
IGetProxyTarget 1 1 type 1 method System.Runtime.InteropServices .WindowsRuntime.IGetProxyTarget
ICustomProperty 0 4 types 8 methods System.Runtime.InteropServices .WindowsRuntime.ICustomProperty
IIterable<T> 0.6 5 types 1 method System.Runtime.InteropServices .WindowsRuntime.IIterable<T>
IBindableIterable 1 1 type 1 method System.Runtime.InteropServices .WindowsRuntime.IBindableIterable
IIterator<T> 0.17 9 types 4 methods System.Runtime.InteropServices .WindowsRuntime.IIterator<T>
IBindableIterator 0.17 6 types 3 methods System.Runtime.InteropServices .WindowsRuntime.IBindableIterator
IVector<T> 0.27 4 types 12 methods System.Runtime.InteropServices .WindowsRuntime.IVector<T>
IVector_Raw<T> 0.83 1 type 12 methods System.Runtime.InteropServices .WindowsRuntime.IVector_Raw<T>
IVectorView<T> 0.38 6 types 4 methods System.Runtime.InteropServices .WindowsRuntime.IVectorView<T>
IBindableVector 0.33 3 types 10 methods System.Runtime.InteropServices .WindowsRuntime.IBindableVector
IBindableVectorView 0 1 type 3 methods System.Runtime.InteropServices .WindowsRuntime.IBindableVectorView
IMap<K,V> 0.29 3 types 7 methods System.Runtime.InteropServices .WindowsRuntime.IMap<K,V>
IMapView<K,V> 0.19 4 types 4 methods System.Runtime.InteropServices .WindowsRuntime.IMapView<K,V>
IKeyValuePair<K,V> 0.67 3 types 2 methods System.Runtime.InteropServices .WindowsRuntime.IKeyValuePair<K,V>
OpportunisticIntern+IInternable 0.6 3 types 5 methods Microsoft.Build .OpportunisticIntern+IInternable
INodeEndpoint 0 3 types 7 methods Microsoft.Build.BackEnd.INodeEndpoint
INodePacket 0.4 5 types 1 method Microsoft.Build.BackEnd.INodePacket
INodePacketHandler 0.5 2 types 1 method Microsoft.Build.BackEnd .INodePacketHandler
INodePacketTranslatable 1 2 types 1 method Microsoft.Build.BackEnd .INodePacketTranslatable
INodePacketTranslator 0.063 14 types 27 methods Microsoft.Build.BackEnd .INodePacketTranslator
IRecordEnum 1 1 type 1 method Microsoft.VisualBasic.CompilerServices .IRecordEnum
IRowsetInternal 0.3 2 types 5 methods Microsoft.VisualBasic.Compatibility.VB6 .IRowsetInternal
IRowsetChangeInternal 0.33 1 type 3 methods Microsoft.VisualBasic.Compatibility.VB6 .IRowsetChangeInternal
IDataFormatInternal 0.36 1 type 14 methods Microsoft.VisualBasic.Compatibility.VB6 .IDataFormatInternal
IScriptScope 0 2 types 1 method Microsoft.Compiler.VisualBasic .IScriptScope
ITypeScope 0 2 types 2 methods Microsoft.Compiler.VisualBasic .ITypeScope
IImportScope 0 2 types 1 method Microsoft.Compiler.VisualBasic .IImportScope
UCOMITransactionBridgeNetworkConfigXP 1 1 type 7 methods Microsoft.Transactions.Bridge.Dtc .UCOMITransactionBridgeNetworkConfigXP
UCOMITransactionBridgeNetworkConfig 1 1 type 8 methods Microsoft.Transactions.Bridge.Dtc .UCOMITransactionBridgeNetworkConfig
UCOMIGatewayProtocol 0.67 1 type 3 methods Microsoft.Transactions.Bridge.Dtc .UCOMIGatewayProtocol
IActivationCoordinator 0.2 5 types 1 method Microsoft.Transactions.Wsat.Messaging .IActivationCoordinator
ICompletionCoordinator 0.2 5 types 3 methods Microsoft.Transactions.Wsat.Messaging .ICompletionCoordinator
ICompletionParticipant 0.25 4 types 3 methods Microsoft.Transactions.Wsat.Messaging .ICompletionParticipant
IDatagramService 0 1 type 2 methods Microsoft.Transactions.Wsat.Messaging .IDatagramService
IRequestReplyService 0 4 types 3 methods Microsoft.Transactions.Wsat.Messaging .IRequestReplyService
IWSActivationCoordinator 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSActivationCoordinator
IWSRegistrationCoordinator 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSRegistrationCoordinator
IWSCompletionCoordinator 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSCompletionCoordinator
IWSCompletionParticipant 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSCompletionParticipant
IWSTwoPhaseCommitCoordinator 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSTwoPhaseCommitCoordinator
IWSTwoPhaseCommitParticipant 0.5 2 types 1 method Microsoft.Transactions.Wsat.Messaging .IWSTwoPhaseCommitParticipant
ICoordinationListener 0.33 5 types 3 methods Microsoft.Transactions.Wsat.Messaging .ICoordinationListener
IRegistrationCoordinator 0.2 5 types 1 method Microsoft.Transactions.Wsat.Messaging .IRegistrationCoordinator
ITwoPhaseCommitCoordinator 0.2 5 types 6 methods Microsoft.Transactions.Wsat.Messaging .ITwoPhaseCommitCoordinator
ITwoPhaseCommitParticipant 0.2 5 types 4 methods Microsoft.Transactions.Wsat.Messaging .ITwoPhaseCommitParticipant
ITimerRecipient 1 1 type 3 methods Microsoft.Transactions.Wsat.Protocol .ITimerRecipient
IProtocolProvider 0.3 3 types 9 methods Microsoft.Transactions.Bridge .IProtocolProvider
IProtocolProviderCoordinatorService 0.14 20 types 6 methods Microsoft.Transactions.Bridge .IProtocolProviderCoordinatorService
IProtocolProviderPropagationService 0.079 7 types 9 methods Microsoft.Transactions.Bridge .IProtocolProviderPropagationService
IProducerConsumerQueue<T> 0.6 2 types 5 methods System.Threading.Tasks .IProducerConsumerQueue<T>
IDataflowBlock 0.087 23 types 3 methods System.Threading.Tasks.Dataflow .IDataflowBlock
IReceivableSourceBlock<TOutput> 0.5 1 type 2 methods System.Threading.Tasks.Dataflow .IReceivableSourceBlock<TOutput>
ISourceBlock<TOutput> 0.13 29 types 4 methods System.Threading.Tasks.Dataflow .ISourceBlock<TOutput>
ITargetBlock<TInput> 0.11 35 types 1 method System.Threading.Tasks.Dataflow .ITargetBlock<TInput>
IDebuggerDisplay 1 6 types 1 method System.Threading.Tasks.Dataflow.Internal .IDebuggerDisplay
IReorderingBuffer 0.25 4 types 1 method System.Threading.Tasks.Dataflow.Internal .IReorderingBuffer
ICSharpInvokeOrInvokeMemberBinder 0.57 2 types 7 methods Microsoft.CSharp.RuntimeBinder .ICSharpInvokeOrInvokeMemberBinder
ITypeOrNamespace 0.2 5 types 4 methods Microsoft.CSharp.RuntimeBinder.Semantics .ITypeOrNamespace
IErrorSink 0.25 2 types 2 methods Microsoft.CSharp.RuntimeBinder.Errors .IErrorSink
IKeyed 1 1 type 1 method Microsoft.Build.Collections.IKeyed
IInternetSecurityManager 0.12 1 type 8 methods IInternetSecurityManager
IClrStrongNameUsingIntPtr 0.24 1 type 25 methods Microsoft.Runtime.Hosting .IClrStrongNameUsingIntPtr
IClrStrongName 0.36 1 type 25 methods Microsoft.Runtime.Hosting.IClrStrongName
OpportunisticIntern+IInternable 0.6 3 types 5 methods Microsoft.Build .OpportunisticIntern+IInternable
IComReferenceResolver 0.17 2 types 3 methods Microsoft.Build.Tasks .IComReferenceResolver
UCOMICreateITypeLib 0.1 1 type 10 methods Microsoft.Build.Tasks .UCOMICreateITypeLib
IMetaDataDispenser 0.33 1 type 3 methods Microsoft.Build.Tasks.IMetaDataDispenser
IMetaDataImport 0 2 types 62 methods Microsoft.Build.Tasks.IMetaDataImport
IMetaDataImport2 0.014 2 types 69 methods Microsoft.Build.Tasks.IMetaDataImport2
IMetaDataAssemblyImport 0.25 2 types 14 methods Microsoft.Build.Tasks .IMetaDataAssemblyImport
IAssemblyCache 0.1 2 types 5 methods Microsoft.Build.Tasks.IAssemblyCache
IAssemblyName 0.056 2 types 9 methods Microsoft.Build.Tasks.IAssemblyName
IAssemblyEnum 0.17 2 types 3 methods Microsoft.Build.Tasks.IAssemblyEnum
IEngineCallback 0.18 12 types 6 methods Microsoft.Build.BuildEngine .IEngineCallback
INodeProvider 0.3 3 types 10 methods Microsoft.Build.BuildEngine .INodeProvider
ITaskRegistry 0.22 6 types 3 methods Microsoft.Build.BuildEngine .ITaskRegistry
OpportunisticIntern+IInternable 0.26 7 types 5 methods Microsoft.Build .OpportunisticIntern+IInternable
IToolsetProvider 0.17 6 types 2 methods Microsoft.Build.Evaluation .IToolsetProvider
ConditionEvaluator+IConditionEvaluationS tate 0.22 7 types 7 methods Microsoft.Build.Evaluation .ConditionEvaluator+IConditionEvaluation State
IEvaluatorData<P,I,M,D> 0.43 2 types 38 methods Microsoft.Build.Evaluation .IEvaluatorData<P,I,M,D>
IItem 0.3 10 types 5 methods Microsoft.Build.Evaluation.IItem
IItemDefinition<M> 0.33 3 types 2 methods Microsoft.Build.Evaluation .IItemDefinition<M>
IItemFactory<S,T> 0.14 8 types 8 methods Microsoft.Build.Evaluation.IItemFactory <S,T>
IItem<M> 0.5 2 types 2 methods Microsoft.Build.Evaluation.IItem<M>
IItemProvider<T> 0.14 7 types 1 method Microsoft.Build.Evaluation.IItemProvider <T>
IMetadataTable 0.037 9 types 3 methods Microsoft.Build.Evaluation .IMetadataTable
IProjectMetadataParent 1 1 type 2 methods Microsoft.Build.Evaluation .IProjectMetadataParent
IProperty 0.33 10 types 3 methods Microsoft.Build.Evaluation.IProperty
IPropertyProvider<T> 0.1 10 types 2 methods Microsoft.Build.Evaluation .IPropertyProvider<T>
IKeyed 0.7 10 types 1 method Microsoft.Build.Collections.IKeyed
IDeepCloneable<T> 1 1 type 1 method Microsoft.Build.Collections .IDeepCloneable<T>
IValued 1 3 types 1 method Microsoft.Build.Collections.IValued
IElementLocation 0.042 48 types 4 methods Microsoft.Build.Shared.IElementLocation
INodeEndpoint 0.2 5 types 7 methods Microsoft.Build.BackEnd.INodeEndpoint
INodePacket 0.56 18 types 1 method Microsoft.Build.BackEnd.INodePacket
INodePacketFactory 0.31 4 types 4 methods Microsoft.Build.BackEnd .INodePacketFactory
INodePacketHandler 0.17 6 types 1 method Microsoft.Build.BackEnd .INodePacketHandler
INodePacketTranslatable 1 3 types 1 method Microsoft.Build.BackEnd .INodePacketTranslatable
INodePacketTranslator 0.091 45 types 27 methods Microsoft.Build.BackEnd .INodePacketTranslator
IConfigCache 0.29 7 types 11 methods Microsoft.Build.BackEnd.IConfigCache
IResultsCache 0.39 4 types 7 methods Microsoft.Build.BackEnd.IResultsCache
ITargetBuilderCallback 0.33 3 types 1 method Microsoft.Build.BackEnd .ITargetBuilderCallback
IRequestBuilder 0.26 3 types 9 methods Microsoft.Build.BackEnd.IRequestBuilder
IRequestBuilderCallback 0.42 2 types 6 methods Microsoft.Build.BackEnd .IRequestBuilderCallback
ITargetBuilder 1 1 type 1 method Microsoft.Build.BackEnd.ITargetBuilder
ITaskBuilder 0.5 2 types 1 method Microsoft.Build.BackEnd.ITaskBuilder
IBuildResults 0.44 1 type 9 methods Microsoft.Build.BackEnd.IBuildResults
IBuildRequestEngine 0.67 2 types 18 methods Microsoft.Build.BackEnd .IBuildRequestEngine
INodeManager 0.62 2 types 4 methods Microsoft.Build.BackEnd.INodeManager
INodeProvider 0.6 2 types 5 methods Microsoft.Build.BackEnd.INodeProvider
IBuildComponent 0.28 9 types 2 methods Microsoft.Build.BackEnd.IBuildComponent
IBuildComponentHost 0.19 26 types 6 methods Microsoft.Build.BackEnd .IBuildComponentHost
IScheduler 0.89 1 type 9 methods Microsoft.Build.BackEnd.IScheduler
INode 1 1 type 1 method Microsoft.Build.BackEnd.INode
ITaskExecutionHost 0.89 1 type 9 methods Microsoft.Build.BackEnd .ITaskExecutionHost
ILoggingService 0.053 31 types 48 methods Microsoft.Build.BackEnd.Logging .ILoggingService
IBuildEventSink 0.3 3 types 9 methods Microsoft.Build.BackEnd.Logging .IBuildEventSink
IRegisteredTaskObjectCache 0.42 3 types 4 methods Microsoft.Build.BackEnd.Components .Caching.IRegisteredTaskObjectCache
ICatalog2 0.088 1 type 57 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICatalog2
ICatalogObject 0.48 3 types 7 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICatalogObject
ICatalogCollection 0.29 3 types 16 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICatalogCollection
IPSFactoryBuffer 0.5 1 type 2 methods Microsoft.Tools.ServiceModel .ComSvcConfig.IPSFactoryBuffer
ICreateTypeLib 0.25 2 types 10 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICreateTypeLib
ICreateTypeInfo 0.13 1 type 23 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICreateTypeInfo
ICreateTypeInfo2 0.053 1 type 38 methods Microsoft.Tools.ServiceModel .ComSvcConfig.ICreateTypeInfo2
IEnumUnknown 0.25 1 type 4 methods Microsoft.Tools.ServiceModel .ComSvcConfig.IEnumUnknown
IClrMetaHost 0.17 1 type 6 methods Microsoft.Tools.ServiceModel .ComSvcConfig.IClrMetaHost
IClrRuntimeInfo 0.071 2 types 7 methods Microsoft.Tools.ServiceModel .ComSvcConfig.IClrRuntimeInfo

 

Are SOLID principles Cargo Cult?

My last post about SOLID Design: The Single Responsibility Principle (SRP) generated some discussion on reddit. The discussion originated from a remark considering SOLID principles as Cargo Cult. Taking account the definition of Cargo Cult the metaphor is a bit provocative but it is not unfounded.

cargo cult is a belief system among members of a relatively undeveloped society in which adherents practice superstitious rituals hoping to bring modern goods supplied by a more technologically advanced society

The recent Boeing’s 737 Max fiasco revealed that some parts of their software have been outsourced to $9-an-hour engineers. Those engineers shouldn’t be blamed for not achieving top notch software taking account the budget. Nevertheless it is clear that a lot of software written nowadays look like this cargo cult plane. For many real-world developers, SOLID principles are superstitious rituals whose primary goal is to succeed during job interview.

The SRP article underlines that SRP is the only SOLID principle not related to the usage of abstraction and polymorphism. SRP is about logic partitioning into code: which logic should be declared in which class. But SRP is so vague it is practically useless from its two definitions.

Definition 1: A class should have a single responsibility and this responsibility should be entirely encapsulated by the class.

Definition 2: A class should have one reason to change.

One can justify any class design choice by tweaking somehow what is a responsibility or what is a reason to change. In other words, as someone wrote in comment: Most people who “practice” it don’t actually know what it means and use it as an excuse to do whatever the hell they were going to do anyways.

We can feel bitterness in those comments, certainly coming from seasoned developers whose job is to fix mistakes of $9 an hour engineers.

SOLID Principles vs. OOP Patterns

We must remember that SOLID principles emerged in the 80s and 90s from the work of world-class OOP experts like Robert C. Martin (Uncle Bob) and Bertrand Meyer. Software writing is often considered as an art. Terminologies such as clean code or beautiful code have been widely used. But art is a subjective activity. In this context, SOLID principles necessarily remain vague and subject to interpretation. And this is what makes the difference between a SOLID principle and an OOP pattern:

  • A SOLID Principle is subjective. It helps to guide the usage of powerful concepts of Object Oriented Programming (OOP).
  • An OOP Pattern is objective. It is a set of recipes to implement a well identified situation with the OOP concepts.

Despite a restraint number of keywords and operators, the OOP toolbelt of languages such as C# or Java is very rich. With a few dozens of characters it is possible to write code that puzzle experts. C# especially gets richer and richer with many syntactic sugars to express complex situations with just a few characters. This power is a double edged sword: seasoned developers can write neat and compact code. But on the other hand it is easy to misuse this power, especially for junior developers and all those that write code just to pay their bills.

Always keep in mind the KISS principle

Someone wrote in comments: “SOLID encourages abstraction, and abstraction increases complexity. It’s not always worth it, but it’s always presented as the non-plus ultra of good approaches.”

The only reason to be for abstraction in OOP is to simplify the implementation of a complex business rule.

  • Abstracting Circle, Rectangle and Triangle with an IShape interface will dramatically simplify the implementation of a shape drawing software.
  • On the other hand, creating an interface for each class is a waste of resource: not every concepts in your program deserve an abstraction.

This is why the Keep It Simple Stupid KISS principle should be always kept in mind: don’t add up extra implementation complexity on top of the business complexity.

SOLID and Static Analysis

I am in the .NET static analysis industry since 2004. At that time I was consulting for large companies with massive legacy apps that were very costly to maintain. Books like Robert Martin’s Agile Principles, Patterns, and Practices made me realize that the source code is data. This data can be measured with code metrics. And the same way relational data can be crawled with SQL queries, code as data can be crawled with code queries. For example:

This query will objectively match complex methods not fully covered by tests. There are situations where one can argue that static analysis returns false positives but there is no justification for complex methods not well tested.

Not all aspects of SOLID principles can be objectively measured and verified. However static analysis can help bring objectiveness. For example:

SOLID and Testability

Regularly applying such rules will avoid taking SOLID too far to the point it becomes detrimental. However there are still all those aspects of SOLID, and code design in general, that must be left to creativity and interpretation. Experience in software development helps a lot here: over the years one refines his/her gut feeling about which design will increase flexibility and maintainability.

By definition juniors developer have no experience. However anyone can relentlessly struggle for 100% code coverage by tests. Being able to fully cover your code means, by definition, that your code is testable. Testability doesn’t come by chance. The properties that leads to full testability are the same properties that leads to high maintainability. Those properties include:

  • Easiness to use API
  • Domain classes well isolated
  • Careful map of logic to classes
  • Short classes and short methods
  • Cohesive classes
  • Abstractions and polymorphism used judiciously
  • Careful management of states mutability

Advices to add up objectivity when applying SOLID principles

Not everyone is a senior developer with a passion for well designed code. As a consequence Cargo Cult usage of SOLID principles is common. To improve the design some objectivity needs to be added in the development process. Here are my 3 advices for that:

  • KISS principle first, always struggle for simplicity: if it is complicated it is not SOLID.
  • Use static analysis to automatically monitor some measurable aspects of SOLID. Gross violations of code quality rules and metrics are also SOLID principles violations.
  • Refactor your code until it becomes seamlessly 100% coverable by tests. Code that cannot be easily 100% covered by tests is not SOLID.

 

 

Exploring .NET Core 3.0 new API

.NET Core 3.0 is representing a major step for the .NET community. It is interesting to analyze what’s new in the API directly from the compiled bits. In this post I will first explain how to diff .NET Core 3.0 against .NET Core 2.2 with NDepend, and then how to browse diff results.

Arguably the biggest progress of .NET Core 3.0 will be the support for Winforms and WPF on the Windows platform. Since everything is new here, compare to .NET Core 2.2, we won’t analyze this part. However it will be interesting to analyze .NET Fx Winforms/WPF APIs vs .NET Core 3.0 Winforms/WPF APIs in another post (that I finally wrote here).

Analyzing two versions of .NET Core with NDepend

It takes a few minutes to download NDepend trial, install it and start VisualNDepend.exe, and it takes a few minutes to compare .NET Core 3.0 against .NET Core 2.2. If you want to browse the diff on your machine, expect 5 to 10 minutes to get hands-on.

First Start VisualNDepend.exe and click Compare 2 versions of a code base:

How to compare 2 versions of a code base

For both builds, choose Add Assemblies in Folder:

  • Choose C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.2  for Older Build
  • Choose C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0-preview-27324-5 for Newer Build
Choose assemblies in folder to analyze

Respectively 156 and 161 assemblies are gathered. Click Ok to run two analysis, on older and newer build. Both analysis results will be then diffed automatically.

Ready to compare 2 versions of .NET Core

Querying new API

Let’s start with a few CQLinq code queries to explore the new .NET Core 3.0 APIs:

This query match all new public code elements, including new assemblies, namespace, types, methods and fields:

Use the NDepend query result to browse this large new API set : 5 new assemblies, 83 new namespaces, 297 new types, 4 924 new methods and 307 new fields. Note that code elements with pink background are not matched by the query, they are just here for preserving the code hierarchy in the result:

.NET Core 3.0 new public API

Download here this long list obtained by exporting the query result to excel. For a better result formatting I actually used this refined query to show properly parent assemblies/namespaces/types in excel columns:


It is interesting to just focus on the 297 new public types with the code query below. Download the list here or browse the same list at the end of this post.

New .NET Core 3.0 Public Types

It is also interesting to browse the new 1.101 public methods and 38 public fields added on public types that existed already in .NET Core 2.2.  Download this list here.

API Breaking Changes

NDepend proposes 6 default rules to browse API breaking changes.

These rules matche 19 public types removed from .NET Core 2.2 (see list below) 176 public methods removed and 36 public fields removed

.NET Core 2.2 Types Removed

Listing Methods Changed

Exploring the API evolution is useful for API consumers. For those working on the framework .NET Core itself, it is interesting to also browse implementation changes. The NDepend search by change panel proposes various options for that. Note that this search panel is actually a code query generator. The Edit query button proposes to edit and refine the currently generated query.

Another interesting point is that it is a semantic implementation change. All matched methods do behave differently at runtime. This makes this tool ideal to plan code change review without bothering with formatting and comments change.

Matched code elements can be highlighted in the metric view. From the screenshot above we can see at a glance that System.Xml and System.Data are much more stable than System.RunTime for example. By zooming in the view, we can get more information about which code was churned.

Highlight methods where code was changed

In the query result panel, a code element is underlined when its implementation changed. If you have compiled both source versions on your machine and analyzed those compiled versions, you can right click an underlined method and directly compare the diff in source code.

I hope you see value both in the results offered and in the how-to-diff procedure that can be applied to any .NET code base, assuming you have 2 versions to compare.

New .NET Core 3.0 types

Here is the list of the 297 new types added to .NET Core 3.0.

ParentAssembly Full Name
WindowsBase System.Windows.Markup .ValueSerializerAttribute
System.Xml.Linq System.Xml.XPath.XDocumentExtensions
System.Threading.ThreadPool System.Threading.IThreadPoolWorkItem
System.Threading.Tasks System.Runtime.CompilerServices .AsyncIteratorMethodBuilder
System.Threading.Tasks System.Runtime.CompilerServices .ConfiguredCancelableAsyncEnumerable<T>
System.Text.Json System.Text.Json.JsonCommentHandling
System.Text.Json System.Text.Json.JsonTokenType
System.Text.Json System.Text.Json.JsonDocument
System.Text.Json System.Text.Json.JsonElement
System.Text.Json System.Text.Json .JsonElement+ArrayEnumerator
System.Text.Json System.Text.Json .JsonElement+ObjectEnumerator
System.Text.Json System.Text.Json.JsonProperty
System.Text.Json System.Text.Json.JsonValueType
System.Text.Json System.Text.Json.JsonReaderException
System.Text.Json System.Text.Json.JsonReaderOptions
System.Text.Json System.Text.Json.JsonReaderState
System.Text.Json System.Text.Json.Utf8JsonReader
System.Text.Json System.Text.Json.JsonWriterOptions
System.Text.Json System.Text.Json.JsonWriterState
System.Text.Json System.Text.Json.Utf8JsonWriter
System.Security.Principal.Windows System.Security.Principal .WindowsAccountType
System.Security.Cryptography.Primitives System.Security.Cryptography .PbeEncryptionAlgorithm
System.Security.Cryptography.Primitives System.Security.Cryptography .PbeParameters
System.Security.Cryptography.Algorithms System.Security.Cryptography.AesCcm
System.Security.Cryptography.Algorithms System.Security.Cryptography.AesGcm
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.CornerRadius
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.DurationType
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Duration
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.GridUnitType
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.GridLength
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Thickness
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.LayoutCycleException
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Markup .XamlParseException
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Automation .ElementNotAvailableException
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Automation .ElementNotEnabledException
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Media.Matrix
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Media.Media3D.Matrix3D
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Media.Animation.KeyTime
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Media.Animation .RepeatBehaviorType
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Media.Animation .RepeatBehavior
System.Runtime.WindowsRuntime.UI.Xaml Windows.UI.Xaml.Controls.Primitives .GeneratorPosition
System.Runtime.WindowsRuntime Windows.UI.Color
System.Runtime.WindowsRuntime Windows.Foundation.Point
System.Runtime.WindowsRuntime Windows.Foundation.Rect
System.Runtime.WindowsRuntime Windows.Foundation.Size
System.Runtime.WindowsRuntime System.WindowsRuntimeSystemExtensions
System.Runtime.WindowsRuntime System.IO .WindowsRuntimeStorageExtensions
System.Runtime.WindowsRuntime System.IO.WindowsRuntimeStreamExtensions
System.Runtime.WindowsRuntime System.Threading.DispatcherQueueHandler
System.Runtime.WindowsRuntime System.Threading.DispatcherQueuePriority
System.Runtime.WindowsRuntime System.Runtime.InteropServices .WindowsRuntime.AsyncInfo
System.Runtime.WindowsRuntime System.Runtime.InteropServices .WindowsRuntime.WindowsRuntimeBuffer
System.Runtime.WindowsRuntime System.Runtime.InteropServices .WindowsRuntime .WindowsRuntimeBufferExtensions
System.Runtime.Serialization System.Runtime.Serialization .ISerializationSurrogateProvider
System.Runtime.Loader System.Runtime.Loader .AssemblyDependencyResolver
System.Runtime.Intrinsics System.MidpointRounding
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector64
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector64<T>
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector128
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector128<T>
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector256
System.Runtime.Intrinsics System.Runtime.Intrinsics.Vector256<T>
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86 .FloatComparisonMode
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Aes
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Avx
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Avx2
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Bmi1
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Bmi2
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Fma
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Lzcnt
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Pclmulqdq
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Popcnt
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Sse
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Sse2
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Sse3
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Sse41
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Sse42
System.Runtime.Intrinsics System.Runtime.Intrinsics.X86.Ssse3
System.Runtime.Intrinsics System.Runtime.Intrinsics.Arm.Arm64.Aes
System.Runtime.Intrinsics System.Runtime.Intrinsics.Arm.Arm64.Base
System.Runtime.Intrinsics System.Runtime.Intrinsics.Arm.Arm64.Sha1
System.Runtime.Intrinsics System.Runtime.Intrinsics.Arm.Arm64 .Sha256
System.Runtime.Intrinsics System.Runtime.Intrinsics.Arm.Arm64.Simd
System.Runtime.InteropServices System.Runtime.CompilerServices .IDispatchConstantAttribute
System.Runtime.InteropServices System.Runtime.InteropServices .StandardOleMarshalObject
System.Runtime.InteropServices System.Runtime.InteropServices .NativeLibrary
System.Runtime.Extensions System.AppDomainSetup
System.Runtime.Extensions System.Security.IStackWalk
System.Runtime.Extensions System.Security.PermissionSet
System.Runtime.Extensions System.Security.Permissions .PermissionState
System.Runtime.Extensions System.Runtime.ProfileOptimization
System.Runtime System.ArgIterator
System.Runtime System.IAsyncDisposable
System.Runtime System.Index
System.Runtime System.Range
System.Runtime System.Text.Rune
System.Runtime System.Text.StringRuneEnumerator
System.Runtime System.Globalization.ISOWeek
System.Runtime System.Threading.Tasks.Sources .ManualResetValueTaskSourceCore<TResult>
System.Runtime System.Runtime.Remoting.ObjectHandle
System.Runtime System.Runtime.CompilerServices .AsyncIteratorStateMachineAttribute
System.Runtime System.Runtime.CompilerServices .CallerArgumentExpressionAttribute
System.Runtime System.Collections.Generic .IAsyncEnumerable<T>
System.Runtime System.Collections.Generic .IAsyncEnumerator<T>
System.Private.CoreLib System.IAsyncDisposable
System.Private.CoreLib System.Index
System.Private.CoreLib System.Range
System.Private.CoreLib System.Text .StringBuilder+ChunkEnumerator
System.Private.CoreLib System.Text.Rune
System.Private.CoreLib System.Text.SpanRuneEnumerator
System.Private.CoreLib System.Text.StringRuneEnumerator
System.Private.CoreLib System.Globalization.ISOWeek
System.Private.CoreLib System.Buffers.OperationStatus
System.Private.CoreLib System.Buffers.StandardFormat
System.Private.CoreLib System.Buffers.Text.Utf8Formatter
System.Private.CoreLib System.Buffers.Text.Utf8Parser
System.Private.CoreLib System.Buffers.Binary.BinaryPrimitives
System.Private.CoreLib System.Threading.Tasks.Sources .ManualResetValueTaskSourceCore<TResult>
System.Private.CoreLib System.Runtime.Remoting.ObjectHandle
System.Private.CoreLib System.Runtime.Loader .AssemblyDependencyResolver
System.Private.CoreLib System.Runtime.CompilerServices .AsyncIteratorMethodBuilder
System.Private.CoreLib System.Runtime.CompilerServices .AsyncIteratorStateMachineAttribute
System.Private.CoreLib System.Runtime.CompilerServices .CallerArgumentExpressionAttribute
System.Private.CoreLib System.Runtime.CompilerServices .ConfiguredCancelableAsyncEnumerable<T>
System.Private.CoreLib System.Runtime.CompilerServices .ConfiguredCancelableAsyncEnumerable<T >+Enumerator
System.Private.CoreLib System.Runtime.Intrinsics.Vector64
System.Private.CoreLib System.Runtime.Intrinsics.Vector128
System.Private.CoreLib System.Runtime.Intrinsics.Vector256
System.Private.CoreLib System.Runtime.Intrinsics.X86.Bmi1+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Bmi2+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Lzcnt+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Popcnt+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Sse+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Sse2+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Sse41+X64
System.Private.CoreLib System.Runtime.Intrinsics.X86.Sse42+X64
System.Private.CoreLib System.Runtime.InteropServices .DllImportResolver
System.Private.CoreLib System.Runtime.InteropServices .NativeLibrary
System.Private.CoreLib System.Runtime.InteropServices .ComActivationContext
System.Private.CoreLib System.Runtime.InteropServices .ComActivationContextInternal
System.Private.CoreLib System.Runtime.InteropServices .ComActivator
System.Private.CoreLib System.Runtime.InteropServices .ComEventInterfaceAttribute
System.Private.CoreLib System.Runtime.InteropServices .DefaultParameterValueAttribute
System.Private.CoreLib System.Diagnostics.DebugProvider
System.Private.CoreLib System.Collections.Generic .IAsyncEnumerable<T>
System.Private.CoreLib System.Collections.Generic .IAsyncEnumerator<T>
System.Private.CoreLib Internal.Resources.PRIExceptionInfo
System.Private.CoreLib Internal.Resources .WindowsRuntimeResourceManagerBase
System.Private.CoreLib Internal.Threading.Tasks .AsyncCausalitySupport
System.Private.CoreLib Internal.Runtime.InteropServices .WindowsRuntime.ExceptionSupport
System.ObjectModel System.Reflection.ICustomTypeProvider
System.ObjectModel System.ComponentModel .TypeConverterAttribute
System.ObjectModel System.ComponentModel .TypeDescriptionProviderAttribute
System.ObjectModel System.Windows.Markup .ValueSerializerAttribute
System.Net.Sockets System.Net.Sockets.SafeSocketHandle
System.Memory System.Text.SpanRuneEnumerator
System.Memory System.Buffers.SequenceReader<T>
System.Memory System.Buffers.SequenceReaderExtensions
System System.StringNormalizationExtensions
System System.Reflection.ICustomTypeProvider
System System.Windows.Markup .ValueSerializerAttribute
System System.Runtime.InteropServices .StandardOleMarshalObject
System System.Diagnostics.ConsoleTraceListener
System System.Diagnostics .XmlWriterTraceListener
System System.Diagnostics.StackFrameExtensions
System System.Security.SecureStringMarshal
System System.Net.Sockets .SocketReceiveFromResult
System System.Net.Sockets .SocketReceiveMessageFromResult
System System.Net.Sockets.SocketTaskExtensions
System.Diagnostics.TextWriterTraceListener System.Diagnostics.ConsoleTraceListener
System.Diagnostics.TextWriterTraceListener System.Diagnostics .XmlWriterTraceListener
System.Data System.Xml.XmlDataDocument
System.Data System.Data.Common.DbColumn
System.Data System.Data.Common .DbDataReaderExtensions
System.Data System.Data.Common .IDbColumnSchemaGenerator
System.Core System.Security.Cryptography.AesCng
System.Core System.Security.Cryptography.DSACng
System.Core System.Security.Cryptography .TripleDESCng
System.Core System.Security.Cryptography.ECCurve
System.Core System.Security.Cryptography .ECParameters
System.Core System.Security.Cryptography.ECPoint
System.Core System.Security.Cryptography .IncrementalHash
System.Core System.Security.Cryptography .X509Certificates.CertificateRequest
System.Core System.Security.Cryptography .X509Certificates .DSACertificateExtensions
System.Core System.Security.Cryptography .X509Certificates .SubjectAlternativeNameBuilder
System.Core System.Security.Cryptography .X509Certificates.X509SignatureGenerator
System.ComponentModel.TypeConverter System.ComponentModel.VersionConverter
System.ComponentModel.Primitives System.ComponentModel .InvalidAsynchronousStateException
System.ComponentModel.DataAnnotations System.ComponentModel.DataAnnotations .AssociatedMetadataTypeTypeDescriptionPr ovider
System.ComponentModel.DataAnnotations System.ComponentModel.DataAnnotations .MetadataTypeAttribute
System.ComponentModel.Annotations System.ComponentModel.DataAnnotations .AssociatedMetadataTypeTypeDescriptionPr ovider
System.ComponentModel.Annotations System.ComponentModel.DataAnnotations .MetadataTypeAttribute
mscorlib System.TupleExtensions
mscorlib System.AppDomainSetup
mscorlib System.Globalization .GlobalizationExtensions
mscorlib System.Threading.ThreadPoolBoundHandle
mscorlib System.Threading.PreAllocatedOverlapped
mscorlib System.Runtime.ProfileOptimization
mscorlib System.Runtime.Remoting.ObjectHandle
mscorlib System.Runtime.CompilerServices .RuntimeFeature
mscorlib System.Runtime.CompilerServices .IsByRefLikeAttribute
mscorlib System.Runtime.CompilerServices.ITuple
mscorlib System.Runtime.CompilerServices .IsReadOnlyAttribute
mscorlib System.Runtime.CompilerServices .TupleElementNamesAttribute
mscorlib System.Runtime.CompilerServices .IDispatchConstantAttribute
mscorlib System.Runtime.InteropServices .RuntimeInformation
mscorlib System.Runtime.InteropServices .Architecture
mscorlib System.Runtime.InteropServices .OSPlatform
mscorlib System.Reflection.Emit.DynamicILInfo
mscorlib System.Security.IStackWalk
mscorlib System.Security.PermissionSet
mscorlib System.Security.Permissions .PermissionState
mscorlib System.Security.Principal .WindowsAccountType
mscorlib System.Diagnostics.Tracing .EventSourceCreatedEventArgs
Microsoft.VisualBasic Microsoft.VisualBasic.Collection
Microsoft.VisualBasic Microsoft.VisualBasic.CompareMethod
Microsoft.VisualBasic Microsoft.VisualBasic.ComClassAttribute
Microsoft.VisualBasic Microsoft.VisualBasic.ControlChars
Microsoft.VisualBasic Microsoft.VisualBasic.DateAndTime
Microsoft.VisualBasic Microsoft.VisualBasic.Information
Microsoft.VisualBasic Microsoft.VisualBasic .MyGroupCollectionAttribute
Microsoft.VisualBasic Microsoft.VisualBasic.VariantType
Microsoft.VisualBasic Microsoft.VisualBasic .VBFixedArrayAttribute
Microsoft.VisualBasic Microsoft.VisualBasic .VBFixedStringAttribute
Microsoft.VisualBasic Microsoft.VisualBasic.VBMath
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO.FileSystem
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .DeleteDirectoryOption
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .RecycleOption
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .SearchOption
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .UICancelOption
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO.UIOption
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .MalformedLineException
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .SpecialDirectories
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO .TextFieldParser
Microsoft.VisualBasic Microsoft.VisualBasic.FileIO.FieldType
Microsoft.VisualBasic Microsoft.VisualBasic.CompilerServices .BooleanType
Microsoft.VisualBasic Microsoft.VisualBasic.CompilerServices .DecimalType
Microsoft.VisualBasic Microsoft.VisualBasic.CompilerServices .Versioned
Microsoft.VisualBasic Microsoft.VisualBasic.CompilerServices .DoubleType
Microsoft.VisualBasic Microsoft.VisualBasic .ApplicationServices.StartupEventArgs
Microsoft.VisualBasic Microsoft.VisualBasic .ApplicationServices .StartupNextInstanceEventArgs
Microsoft.VisualBasic Microsoft.VisualBasic .ApplicationServices .UnhandledExceptionEventArgs
Microsoft.VisualBasic Microsoft.VisualBasic.Devices .NetworkAvailableEventArgs
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CallType
Microsoft.VisualBasic.Core Microsoft.VisualBasic.Collection
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompareMethod
Microsoft.VisualBasic.Core Microsoft.VisualBasic.ComClassAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.Constants
Microsoft.VisualBasic.Core Microsoft.VisualBasic.ControlChars
Microsoft.VisualBasic.Core Microsoft.VisualBasic.DateAndTime
Microsoft.VisualBasic.Core Microsoft.VisualBasic .HideModuleNameAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.Information
Microsoft.VisualBasic.Core Microsoft.VisualBasic .MyGroupCollectionAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.Strings
Microsoft.VisualBasic.Core Microsoft.VisualBasic.VariantType
Microsoft.VisualBasic.Core Microsoft.VisualBasic .VBFixedArrayAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic .VBFixedStringAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.VBMath
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO.FileSystem
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .DeleteDirectoryOption
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .RecycleOption
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .SearchOption
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .UICancelOption
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO.UIOption
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .MalformedLineException
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .SpecialDirectories
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO .TextFieldParser
Microsoft.VisualBasic.Core Microsoft.VisualBasic.FileIO.FieldType
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .BooleanType
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .Conversions
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .DecimalType
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .DesignerGeneratedAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate0
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate1
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate2
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate3
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate4
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate5
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate6
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .SiteDelegate7
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .IncompleteInitialization
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .NewLateBinding
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .ObjectFlowControl
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .ObjectFlowControl+ForLoopControl
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .Operators
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .OptionCompareAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .OptionTextAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .ProjectData
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .StandardModuleAttribute
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .StaticLocalInitFlag
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .Utils
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .Versioned
Microsoft.VisualBasic.Core Microsoft.VisualBasic.CompilerServices .DoubleType
Microsoft.VisualBasic.Core Microsoft.VisualBasic .ApplicationServices.StartupEventArgs
Microsoft.VisualBasic.Core Microsoft.VisualBasic .ApplicationServices .StartupNextInstanceEventArgs
Microsoft.VisualBasic.Core Microsoft.VisualBasic .ApplicationServices .UnhandledExceptionEventArgs
Microsoft.VisualBasic.Core Microsoft.VisualBasic.Devices .NetworkAvailableEventArgs

Advanced Code Search : A Case Study

This morning I stumbled on a complex test to write. The need was to create and show a custom Form (written with Windows Form) that relies on the System.ComponentModel.BackgroundWorker to do initialization stuff without freezing the UI. The test is complex because after creating and showing the form, it must wait somehow to release the UI thread for a while to let the BackgroundWorker achieve the RunWorkerCompleted on the UI thread.

I know that this is something we’ve done in the past and I know this is tricky enough to not reinvent the wheel. But with a test suite of over 13.000 tests this is quite challenging to find where we did that. So I decided to use NDepend querying facility to search.

First I analyze all NDepend assemblies, test assemblies included. Then I generate a code query to match all classes that derive from Form. This can be done from the NDepend Search panel : search Form by name in third-party types and then use a right-click menu to generate the code query:

The CQLinq code query generated is:

60 classes are matched:

Let’s refine this query to match all methods that create any of those form classes.This could be achieved by iterating over (all methods) x (all form classes), but the NDepend.API extension method ThatCreateAny() acts like a join and operates in a linear time. For our search scenario, waiting a few seconds to get a search result is not a problem. But for a code rule written with CQLinq, this is important to run it as fast as possible in a few milliseconds, to run all queries and rules often in Visual Studio within a few seconds, hence the query performance entry on the documentation.

280 methods are instantiating some form classes. Let’s refine the query to match only tests method. The cleanest way would be to check for the usage of TestAttribute, but here just checking for parent assemblies names that contain “Test” is enough:

Still 122 test methods matched.

Before filtering the result even more, let’s refine the query to display for each test the form class(es) it instantiates. This can be achieved with a LINQ range variable formsCreated that we use in the result:

We can now browse which form(s) are instantiated by each test:

Finally let’s browse only tests that use some asynchronous related code. Many ways can be used to check for asynchronous usages. The easiest way is certainly to look at methods called by a test method, and check which ones have named related to async stuff. I tried a few words like “Async” “Sync” “Thread” “TimeOut” “Wait”… and “Wait” worked:

In the source code of the highlighted test I had everything I needed for my scenario, including a link to a tricky stackoverflow answer that we found years ago. I found what I needed within a few minutes and had a bit of fun. I hope the methodology and the resulting query can be adapted to your advanced search scenarios.

Quickly assess your .NET code compliance with .NET Standard

Yesterday evening I had an interesting discussion about the feasibility of migrating parts of the NDepend code to .NET Standard to ultimately run it on .NET Core. We’re not yet there but this might make sense to run at least the code analysis on non Windows platform, especially for NDepend clones CppDepend (for C++), JArchitect (for Java) and others to come.

Then I went to sleep (as every developers know the brain is coding hard while sleeping), then this morning I went for an early morning jogging and it stroke me: NDepend is the perfect tool to  assess some .NET code compliance to .NET Standard, or to any other libraries actually! As soon on my machine I did a proof of concept in less than an hour.

The key is that .NET standard 2.0 types and members are all packet in a single assemblies netstandard.dll v2.0 that can be found under C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll (on my machine).  A quick analyze of netstandard.dll with NDepend shows 2 317 types in 78 namespaces, with 24 303 methods and 884 fields. Let’s precise that netstandard.dll doesn’t contain any code, it is a standard not an implementation. The 68K IL instructions represent the IL code for throw null which is the method body for all non-abstract methods.

.NET Standard 2.0 analyzed by NDepend

(Btw, I am sure that if you read this  you have an understanding of what is .NET Standard but if anything is still unclear, I invite you to read this great article by my friend Laurent Bugnion wrote 3 days ago A Brief History of .NET Standard)

Given that, what stroke me this morning is that to analyze some .NET code compliance to .NET Standard, I’d just have to include netstandard.dll in the list of my application assemblies and write a code query that  filters the dependencies the way I want. Of course to proof test this idea I wanted to explore the NDepend code base compliance to .NET Standard:

NetStandard assembly included in the NDepend assemblies to analyze

The code query was pretty straightforward to write. It is written in a way that:

  • it is easy to use to analyze compliance with any other library than .NET standard,
  • it is easy to explore the compliance and the non-compliance with a library in a comprehensive way, thanks to the NDepend code query result browsing facilities,
  • it is easy to refactor the query for querying more, for example below I refactor it to assess the usage of third-party non .NET Standard compliant code

The result looks like that and IMHO it is pretty interesting. For example we can see at a glance that NDepend.API is almost full compliant with .NET standard except for the usage of System.Drawing.Image (all the 1 type are the Image type actually) and for the usage of code contracts.

NDepend code base compliance with .NET standard

For a more intuitive assessment of the compliance to .NET Standard we can use the metric view, that highlights the code elements matched by the currently edited code query.

  • Unsurprisingly NDepend.UI is not compliant at all,
  • portions of NDepend.Core non compliant to .NET Standard are well defined (and I know it is mostly because of some UI code here too, that we consider Core because it is re-usable in a variety of situations).

With this information it’d be much easier to plan a major refactoring to segregate .NET standard compliant code from the non-compliant one, especially to anticipate hot spots that will be painful to refactor.

The code query to assess compliancy can be refactored at whim. For example I found it interesting to see which non-compliant third-party code elements were the most used. So I refactored the query this way:

Without surprise UI code that is non .NET Standard compliant popups first:

.NET Standard non-compliant third-party code usage

There is no limit to refactor this query to your own need, like assessing usage of non-compliant code — except UI code– for example, or assessing the usage of code non compliant to ASP.NET Core 2 (by changing the library).

Hope you’ll find this content useful to plan your migration to .NET Core and .NET Standard!

A problem with extension methods

We like extension methods. When named accordingly they can both make the caller code clearer, and isolate static methods from classes on which they operate.

But when using extension methods, breaking change can happen, and this risk is very concrete, it actually just happened to us.

Since 2012, NDepend.API proposes a generic Append() extension:

Two default rules use this extension method: Avoid namespaces dependency cycles and Avoid types initialization cycles

Last month, on Oct 17th 2017, Microsoft released .NET Framework v4.7.1 that implements .NET Standard 2.0. Around 200 .NET Standard 2.0 were missing in .NET Framewok v4.6.1, and one of those missing API is:

Within NDepend, rules, quality gates, trend metrics … basically everything, is a C# LINQ query stored as textual and compiled and executed on-the-fly. Since the compilation environment uses both namespaces NDepend.Helpers and System.Linq, when running NDepend on top of the .NET Framework v4.7.1, both Append() extension methods are visible. As a consequence, for each query calling the Append() method, the compiler fails with:

Hopefully a user notified us with this problem that we didn’t catch yet and we just released NDepend v2017.3.2 that fixes this problem Only one clean fix is possible to make it compatible with all .NET Framework versions: refactor all calls to the Append() extension method,  into a classic static method invocation, with an explanatory comment:

We expect support on this within the next weeks and months when more and more users will run the .NET Fx v4.7.1 while not changing their rules-set. There is no lesson learnt, this situation can happen and it happens rarely, this shouldn’t prevent you from declaring and calling extension methods. The more mature the frameworks you are relying on, the less likely it’ll happen.

Static analysis of .NET Core 2.0 applications

NDepend v2017.3 has just been released with major improvements. One of the most requested features, now available, is the support for analyzing .NET Core 2.0 and .NET Standard 2.0 projects. .NET Core and its main flavor, ASP.NET Core, represents a major evolution for the .NET platform. Let’s have a look at how NDepend is analyzing .NET Core code.

Resolving .NET Core third party assemblies

In this post I’ll analyze the OSS application ASP.NET Core / EntityFramework MusicStore hosted on github. From the Visual Studio solution file, NDepend is resolving the application assembly MusicStore.dll and also two test assemblies that we won’t analyze here. In the screenshot below, we can see that:

  • NDepend recognizes the .NET profile, .NET Core 2.0, for this application.
  • It resolves several folders on the machine that are related to .NET Core, especially NuGet package folders.
  • It resolves all 77 third-party assemblies referenced by MusicStore.dll. This is important since many code rules and other NDepend features take into account what the application code is using.

It is worth noticing that the .NET Core platform assemblies have high granularity. A simple website like MusicStore references no fewer than 77 assemblies. This is because the .NET Core framework is implemented through a few NuGet packages that each contain many assemblies. The idea is to release the application only with needed assemblies, in order to reduce the memory footprint.

.NET Core 2.0 third party assemblies granularity

NDepend v2017.3 has a new heuristic to resolve .NET Core assemblies. This heuristic is based on .deps.json files that contain the names of the NuGet packages referenced. Here we can see that 3 NuGet packages are referenced by MusicStore. From these package names, the heuristic will resolve third-party assemblies (in the NuGet store) referenced by the application assemblies (MusicStore.dll in our case).

NuGet packages referenced in .deps.json file

Analyzing .NET Standard assemblies

Let’s be clear that NDepend v2017.3 can also analyze .NET Standard assemblies. Interestingly enough, since .NET Standard 2.0, .NET Standard assemblies reference a unique assembly named netstandard.dll and found in C:\Users\[user]\.nuget\packages\NETStandard.Library\2.0.0\build\netstandard2.0\ref\netstandard.dll.

By decompiling this assembly, we can see that it doesn’t contain any implementation, but it does contain all types that are part of .NET Standard 2.0. This makes sense if we remember that .NET Standard is not an implementation, but is a set of APIs implemented by various .NET profiles, including .NET Core 2.0, the .NET Framework v4.6.1, Mono 5.4 and more.

Browsing how the application is using .NET Core

Let’s come back to the MusicStore application that references 77 assemblies. This assembly granularity makes it impractical to browse dependencies with the dependency graph, since this generates dozens of items. We can see that NDepend suggests viewing this graph as a dependency matrix instead.

NDepend Dependency Graph on an ASP.NET Core 2.0 project

The NDepend dependency matrix can scale seamlessly on a large number of items. The numbers in the cells also provide a good hint about the represented coupling. For example, here we can see that  22 members of the assembly Microsoft.EntityFrameworkCore.dll are used by 32 methods of the assembly MusicStore.dll, and a menu lets us dig into this coupling.

NDepend Dependency Matrix on an ASP.NET Core 2.0 project

Clicking the menu item Open this dependency shows a new dependency matrix where only members involved are kept (the 32 elements in column are using the 22 elements in rows). This way you can easily dig into which part of the application is using what.

NDepend Dependency Matrix on an ASP.NET Core 2.0 project

All NDepend features now work when analyzing .NET Core

We saw how to browse the structure of a .NET Core application, but let’s underline that all NDepend features now work when analyzing .NET Core applications. On the Dashboard we can see code quality metrics related to Quality Gates, Code Rules, Issues and Technical Debt.

NDepend Dashboard on an ASP.NET Core 2.0 project

Also, most of the default code rules have been improved to avoid reporting false positives on .NET Core projects.

NDepend code rules on an ASP.NET Core 2.0 project

We hope you’ll enjoy using all your favorite NDepend features on your .NET Core projects!

Our experience with using third-party libraries

NDepend is a tool that helps .NET developers write beautiful code. The project was started in April 2004. It is now used by more than 6 000 companies worldwide.

In more than a decade, many decisions were made, each with important consequences on the code base evolution process, sometime good consequences, sometime less good. Relentlessly dog-fooding (i.e using NDepend to analyze and improve the NDepend code base) helped us a lot to obtain more maintainable code, less bugs, and to improve the tool usability and features.

When it comes to working on and maintaining a large code base for several years, some of the most important decisions made are related to relying (or not) on some third-party libraries. Choosing whether or not to rely on a library is a double-edged sword decision that can, over time, bring a lot of value or cause a lot of friction. Ultimately users won’t make a difference between your bugs and third-party libraries bugs, their problems become your problems. Consider this:

  • Sometimes the team just needs a fraction of a library and it may be more cost-effective, and more maintainable with time, to develop your own.
  • Sometimes the licensing of a free or commercial library will prevent you from achieving your goals.
  • Sometimes the library looks bright and shiny but becomes an obsolete project a few months later and precious resources will have to be spent maintaining others code, or migrating toward a trendy new library.
  • Sometimes the library code and/or authors are so fascinating that you’ll be proud to contribute and be part of it.

Of course we all hope for the last case, and we had the chance to experience this a few times for real. Here are some libraries we’ve had great success with:

Mono.Cecil (OSS)

Mono.Cecil is an open source project developed by Jean-Baptiste Evain that can read and write data nested in .NET assemblies, including compiled IL code. NDepend has relied on Cecil for almost a decade to read IL code and other data. Both the library and the support provided are outstanding. The performance of the library is near optimal and all bugs reported were fixed in a matter of days or even hours. For our usage, the library is actually close to bug free. If only all libraries had this level of excellence…

DevExpress WinForm (Commercial)

NDepend has also relied on DevExpress WinForm for almost a decade to improve the UI look and feel. NDepend is a Visual Studio extension and DevExpress WinForm makes smooth visual integration with Visual Studio. Concretely, thanks to this library we achieved the exact same Visual Studio theming and skinning, docking controls a la Visual Studio, menus, bars and special controls like BreadCrumb to explore directories. We have never been disappointed with DevExpress WinForm. The bugs we reported were fixed quickly, it supports high DPI ratio and it is rock solid in production.

Microsoft Automatic Graph Layout MSAGL (OSS)

NDepend has relied on MSAGL for several years to draw all sorts of graphs of dependencies between code elements including Call Graphs, Class Inheritance Graphs, Coupling Graphs, Path and Cycle Graphs…  This library used to be commercial but nowadays OSS.  Here also the bugs we reported were fixed quickly, it supports high DPI ratio and it is perfectly stable in production.

NRefactory (OSS)

NDepend used to have a C# Code Query LINQ editor in 2012, a few years before Roslyn became RTM. We wanted to offer users a great editing experience with code completion and documentation tooltips on mouse-hovering. At that time NRefactory was the best choice and it proved with the years to be stable in production. Nowadays Roslyn would certainly be a better choice, but since our initial investment NRefactory still does the job well, we didn’t feel the need (yet) to move to Roslyn.

 

Here are a few things we prefer to keep in-house:

Licensing

While there are libraries for licensing, these are vital, sensitive topics that require a lot of flexibility with time, and we preferred to avoid delegating it. This came at the cost of plenty of development/support and significant levels of acquired expertise. Even taking into account that these efforts could have been spent on product features, we still don’t regret our choice.

The licensing layer is a cornerstone in our relation with our users community and it cannot suffer from any compromise. As a side remark, several times I observed that the cost of developing a solid licensing layer postponed promising projects to become commercial for a while.

Persistence

As most of application, NDepend persists and restores a lot of data, especially the large amount of data in analysis results. We could have used relational or object databases, but for a UI tool embedded in VS, the worst thing would be to slow down the UI and make the user wait. We decided only optimal performance is acceptable for our users, and optimal performance in persistence means using custom streams of bytes. The consequence of this decision is less flexibility: each time our data schema evolves, we need to put in extra effort to keep ascendant compatibility.

I underline that most of the time it is not a good idea to develop a custom persistence layer because of the amount of work and expertise required. But taken account our particular needs and goals, I think we took the right decision.

Production Logs

I explained here about our production logs system. We consider it an essential component to making NDepend a super-stable product. Here also, we could have used a third-party library. We capitalize on our own logging system because, year after year, we customized it with a plethora of production information, which was required to help fix our very own problems. We kept the system lightweight and flexible, and it still helps us improve the overall stability and correctness of our products.

Dependency Matrix and Treemap UI Components

These UI components were developed years ago and are still up to date. Both then and now, I believe there is no good third-party alternative that meets all our requirements in terms of layout and performance. A few times, we received propositions to buy those components, but we are not a component provider and don’t have plans for that.

 

In this post I unveiled a few core choices we made over the years. We hope this information will be useful for other teams.