Accessing Internal Classes from External Assemblies
In scenarios where an external assembly requires access to an object of an internal type within a vendor-supplied assembly, a predicament arises. This article explores how to overcome this challenge without modifying the vendor assembly.
The Dilemma
Consider the following scenario: an external assembly contains an object returned by a method in the vendor assembly. However, this object is actually an instance of an internal class whose fields and methods are inaccessible from the external assembly.
// Vendor assembly public class Vendor { private InternalClass _internal; public object Tag { get { return _internal; } } } // External assembly public class MyClass { public void AccessTest() { Vendor vendor = new Vendor(); object value = vendor.Tag; // Here we want to access InternalClass.test } }
A Solution: InternalsVisibleTo Attribute
By default, internal members are accessible only within the assembly where they are defined. However, there is an exception for "friend" assemblies.
To grant an external assembly (the "friend" assembly) access to internal members, add the [assembly: InternalsVisibleTo] attribute to the AssemblyInfo.cs file of the vendor assembly.
[assembly: InternalsVisibleTo("NameOfFriendAssembly")]
This attribute allows the external assembly to access the internal members of the vendor assembly as if they were internal to its own assembly.
Note: This solution is only suitable for testing purposes, as it exposes internal members to external assemblies.
The above is the detailed content of How Can I Access Internal Classes from an External Assembly Without Modifying the Vendor Assembly?. For more information, please follow other related articles on the PHP Chinese website!