Avoir un assembly que je ne peux pas modifier (fourni par le fournisseur) qui a une méthode retournant un type d' objet mais qui est vraiment de type interne.
Comment accéder aux champs et / ou méthodes de l'objet depuis mon assemblage?
Gardez à l'esprit que je ne peux pas modifier l'assemblage fourni par le fournisseur.
En substance, voici ce que j'ai:
Du fournisseur:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
De mon assemblage en utilisant l'assemblage du fournisseur.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
mais n'ont pas inclus votre assemblage? Si le symbole n'est pas vraiment caché, il fait partie de l'ABI.Je ne vois qu'un seul cas dans lequel vous autoriseriez l'exposition de vos membres internes à une autre assemblée et c'est à des fins de test.
Dire qu'il existe un moyen d'autoriser les assemblys "Friend" à accéder aux composants internes:
Dans le fichier AssemblyInfo.cs du projet, vous ajoutez une ligne pour chaque assembly.
cette information est disponible ici.
J'espère que cela t'aides.
la source
Je voudrais faire valoir un point - que vous ne pouvez pas augmenter l'assemblage d'origine - en utilisant Mono.Cecil, vous pouvez injecter
[InternalsVisibleTo(...)]
dans l'assemblage 3pty. Notez qu'il peut y avoir des implications juridiques - vous jouez avec un assemblage vide et des implications techniques - si l'assembly a un nom fort, vous devez soit le supprimer, soit le signer à nouveau avec une clé différente.Et le code comme:
la source
Réflexion.
Utilisez le pouvoir à bon escient. N'oubliez pas la vérification des erreurs. :)
la source
Eh bien, vous ne pouvez pas. Les classes internes ne peuvent pas être visibles en dehors de leur assembly, donc pas de moyen explicite d'y accéder directement -AFAIK bien sûr. Le seul moyen est d'utiliser la liaison tardive à l'exécution via la réflexion, vous pouvez alors invoquer indirectement des méthodes et des propriétés de la classe interne.
la source