Ter um assembly que não posso modificar (fornecido pelo fornecedor) que tem um método que retorna um tipo de objeto, mas é realmente de um tipo interno.
Como posso acessar os campos e / ou métodos do objeto da minha montagem?
Lembre-se de que não posso modificar a montagem fornecida pelo fornecedor.
Em essência, aqui está o que tenho:
Do fornecedor:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
Da minha montagem usando a montagem do fornecedor.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
mas não incluíram sua montagem? Se o símbolo não estiver realmente oculto, ele faz parte da ABI.Vejo apenas um caso em que você permitiria a exposição de seus membros internos a outra assembléia e que é para fins de teste.
Dizendo que existe uma maneira de permitir o acesso de assemblies "Friend" aos internos:
No arquivo AssemblyInfo.cs do projeto, você adiciona uma linha para cada montagem.
esta informação está disponível aqui.
Espero que isto ajude.
fonte
Eu gostaria de argumentar um ponto - que você não pode aumentar o assembly original - usando Mono.Cecil você pode injetar
[InternalsVisibleTo(...)]
no assembly 3pty. Observe que pode haver implicações legais - você está mexendo com o assembly 3pty e implicações técnicas - se o assembly tiver um nome forte, você precisará removê-lo ou assiná-lo novamente com uma chave diferente.E o código como:
fonte
Reflexão.
Use o poder com sabedoria. Não se esqueça da verificação de erros. :)
fonte
Bem, você não pode. Classes internas não podem ser visíveis fora de seu assembly, portanto, não há maneira explícita de acessá-lo diretamente - AFAIK, é claro. A única maneira é usar a ligação tardia de tempo de execução por meio de reflexão, então você pode invocar métodos e propriedades da classe interna indiretamente.
fonte