Accès aux classes internes à partir d'assemblys externes
Dans les scénarios où un assembly externe nécessite l'accès à un objet de type interne dans un assemblage fourni par le fournisseur assemblée, une situation difficile surgit. Cet article explore comment surmonter ce défi sans modifier l'assembly du fournisseur.
Le dilemme
Considérez le scénario suivant : un assembly externe contient un objet renvoyé par une méthode dans l’assemblée des vendeurs. Cependant, cet objet est en réalité une instance d'une classe interne dont les champs et les méthodes sont inaccessibles depuis l'assembly externe.
// 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 } }
Une solution : attribut InternalsVisibleTo
Par par défaut, les membres internes sont accessibles uniquement dans l'assemblage où ils sont définis. Cependant, il existe une exception pour les assemblys « amis ».
Pour accorder à un assembly externe (l'assembly « ami ») l'accès aux membres internes, ajoutez l'attribut [assembly: InternalsVisibleTo] au fichier AssemblyInfo.cs de l'assemblage du fournisseur.
[assembly: InternalsVisibleTo("NameOfFriendAssembly")]
Cet attribut permet à l'assemblage externe d'accéder aux membres internes de l'assemblage du fournisseur comme s'ils étaient internes au sien. assemblage.
Remarque : Cette solution ne convient qu'à des fins de test, car elle expose les membres internes à des assemblages externes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!