Tener un ensamblado que no puedo modificar (proporcionado por el proveedor) que tiene un método que devuelve un tipo de objeto pero que en realidad es de tipo interno.
¿Cómo puedo acceder a los campos y / o métodos del objeto desde mi ensamblaje?
Tenga en cuenta que no puedo modificar el ensamblaje proporcionado por el proveedor.
En esencia, esto es lo que tengo:
Del proveedor:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
De mi ensamblaje usando el ensamblaje del proveedor.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
pero no incluyeron su ensamblaje? Si el símbolo no está realmente oculto, es parte del ABI.Solo veo un caso en el que permitiría exponer a sus miembros internos a otra asamblea y es para fines de prueba.
Diciendo que hay una manera de permitir que los ensamblajes "amigos" accedan a los componentes internos:
En el archivo AssemblyInfo.cs del proyecto, agrega una línea para cada ensamblaje.
esta información está disponible aquí.
Espero que esto ayude.
fuente
Me gustaría argumentar un punto, que no se puede aumentar el ensamblaje original, usando Mono.Cecil puede inyectar
[InternalsVisibleTo(...)]
en el ensamblaje de 3pty. Tenga en cuenta que puede haber implicaciones legales: está jugando con el ensamblaje de 3pty y las implicaciones técnicas, si el ensamblado tiene un nombre fuerte, debe eliminarlo o volver a firmarlo con una clave diferente.Y el código como:
fuente
Reflexión.
Usa el poder sabiamente. No olvide comprobar los errores. :)
fuente
Bueno, no puedes. Las clases internas no pueden ser visibles fuera de su ensamblaje, por lo que no hay forma explícita de acceder a ellas directamente, por supuesto, AFAIK. La única forma es utilizar el enlace tardío en tiempo de ejecución a través de la reflexión, luego puede invocar métodos y propiedades de la clase interna indirectamente.
fuente