Ce que vous décrivez est partiellement possible. Vous pouvez éliminer le besoin pour eux de référencer explicitement l'assembly masqué, mais cet assembly sera toujours extrait au moment de la compilation et requis lors de l'exécution.
Disons que vous avez ces classes sont définies:
// in assembly 1:
public class A
{
public virtual void Foo() { }
}
// and in assembly 2:
// requires explicit reference to assembly 1 to use
public class B : A
{
public override void Foo() { }
public A Value { get; set; }
public void Foo(A value) { }
}
// has implicit reference to assembly 1, but end user can ignore
public class C
{
private A Value { get; set; }
internal void Foo(A value) { }
protected internal A Bar() { return new A(); }
}
// usable at runtime even if assembly 1 is missing, as long as you don't call Foo()
public class D
{
public void Foo() { A blah = new A(); }
public void Bar() { }
}
Si l'utilisateur final utilise la classe B, ils auront besoin d'une référence explicite à l'assemblage 1. Puisque A fait partie de l'interface publique de B, afin d'utiliser B, vous devez savoir sur A. Il existe 3 références publiques différentes à A, et l'une d'entre elles nécessitera connaître A pour utiliser B.
Cependant, la classe C fait référence à A, mais toutes les références sont privées/interne/local. Puisque toute référence à A est cachée de l'extérieur, l'utilisateur final n'a pas besoin de connaître explicitement l'assemblage 1. Il sera toujours requis lors de l'exécution, mais vous n'avez pas besoin de l'ajouter comme référence, c'est une référence indirecte .
Et si l'utilisateur final utilise la classe D, sans jamais utiliser B ou C, l'assembly 1 ne sera chargé que si vous appelez D.Foo(), qui a une variable locale de type A. Vous pouvez réellement utiliser D. Bar() librement même si l'assembly 1 est complètement manquant à l'exécution. Bien que si vous appelez D.Foo() et assembly 1 est manquant, vous obtiendrez une exception.
L'objectif était de créer un wrapper qui protégerait les utilisateurs finaux des modifications de la couche sous-jacente. Ce wrapper référencerait la base. Donc, si l'utilisateur doit référencer la base, il n'est pas complètement protégé. Je comprends comment les assemblages .Net sont construits mais je me demandais s'il y avait un moyen de contourner cela (une idée folle était d'inverser la classe de base à l'exécution par réflexion, pas sûr que cela soit possible). – Mrchief