É possível instanciar um objeto em tempo de execução se eu tiver apenas o nome da DLL e o nome da classe, sem adicionar uma referência ao assembly no projeto? A classe implementa uma interface, portanto, quando eu instanciar a classe, a converteremos na interface.
Nome da montagem:
library.dll
Digite o nome:
Company.Project.Classname
Edição: Eu não tenho o caminho absoluto da DLL, por Assembly.LoadFile
isso não vai funcionar. A DLL pode estar na raiz do aplicativo, system32 ou mesmo carregada no GAC.
fonte
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Considere as limitações dos diferentes
Load*
métodos. Dos documentos do MSDN ...Mais informações sobre Contextos de carregamento podem ser encontradas nos
LoadFrom
documentos.fonte
Activator.CreateInstance deve funcionar.
Nota: O nome do tipo deve ser o tipo completo.
Exemplo:
fonte
TypeName
deve ser totalmente qualificado. Eu tive que chamar isso assim:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
E isso retorna umObjectHandle
. Para começar a sua interface que você precisa fazerObjectHandle.UnWrap()
Encontrei essa pergunta e algumas respostas muito úteis, porém tive problemas de caminho, portanto, essa resposta abrangeria o carregamento da biblioteca encontrando o caminho do diretório bin.
Primeira solução:
Segunda solução
Você pode usar o mesmo princípio para interfaces (você criaria uma classe, mas converterá em interface), como:
Este exemplo é para aplicativo Web, mas similar pode ser usado para aplicativo Desktop, apenas o caminho é resolvido de maneira diferente, por exemplo
fonte
É fácil.
Exemplo do MSDN:
Aqui está um link de referência
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
fonte
A partir do Framework v4.5, você pode usar o Activator.CreateInstanceFrom () para instanciar facilmente as classes nos assemblies. O exemplo a seguir mostra como usá-lo e como chamar um método passando parâmetros e obtendo valor de retorno.
fonte
Sim. Não tenho exemplos disponíveis pessoalmente. Vou postar mais tarde, quando eu encontrar alguns. Basicamente, você usará a reflexão para carregar a montagem e depois puxar os tipos necessários.
Enquanto isso, esse link deve começar:
Usando reflexão para carregar montagens não referenciadas em tempo de execução
fonte
fonte
Você pode carregar uma montagem usando os métodos * Assembly.Load **. Usando Activator.CreateInstance, você pode criar novas instâncias do tipo desejado. Lembre-se de que você deve usar o nome completo do tipo da classe que deseja carregar (por exemplo, Namespace.SubNamespace.ClassName ). Usando o método InvokeMember do Type classe você pode invocar métodos no tipo.
Além disso, leve em consideração que, uma vez carregado, um assembly não pode ser descarregado até que todo o AppDomain também seja descarregado (isso é basicamente um vazamento de memória).
fonte
Dependendo do quão intrínseco esse tipo de funcionalidade é para o seu projeto, você pode considerar algo como o MEF, que cuidará do carregamento e da união de componentes para você.
fonte
Portanto, dessa maneira, você pode usar funções que não sejam a obtenção de methodinfo e, em seguida, invocá-lo. Você fará isso como instanceOfMyType.MethodName (); Mas você não pode usar o Intellisense porque os tipos dinâmicos são digitados em tempo de execução, não em tempo de compilação.
fonte
Sim, você desejará usar o método Load estático na classe Assembly e, em seguida, chame e, em seguida, chame o método CreateInstance na instância Assembly retornada da chamada para Load.
Além disso, você pode chamar um dos outros métodos estáticos começando com "Load" na classe Assembly, dependendo de suas necessidades.
fonte
Você pode fazer isso desta maneira:
fonte