Alguém poderia me dar uma explicação da diferença entre Assembly e namespace? Sei que o Assembly tem o código compilado e pode ser exe ou dll. Onde entra o namespace nessa história?
Obrigado!
Alguém poderia me dar uma explicação da diferença entre Assembly e namespace? Sei que o Assembly tem o código compilado e pode ser exe ou dll. Onde entra o namespace nessa história?
Obrigado!
Estou com essa dúvida porque eu fiz o seguinte:
1 - criei uma nova biblioteca .dll com o namespace com.arquivo
A classe declarada em com.arquivo possui visibilidade internal.
2 - criei um novo projeto de console e dei o nome ao namespace de com.arquivo, também.
Não consigo acessar a classe da dll a partir desse aplicativo. Esperava que ambos estivessem no mesmo assembly. O acesso é permitido apenas quando mudo a visibilidade da classe na dll para public. Por acaso é considerado no mesmo assembly apenas se estiverem classes no mesmo arquivo, não tendo nada a ver com namespace?
Ola,
Assembly, eh nada mais do que um arquivo que contem codigo compilado. Voce pode ter dois tipos de assemblies, pode ser um arquivo executavel (.exe) ou pode ser uma biblioteca (.dll).
Namespaces, tem a ver com escopo das suas classes, eh uma forma de organizar as suas class e eh bastante util para evitar colisao de nomes, por exemplo, vc pode ter:
namespace test.dummynamespace1
{
public class DummyClass { }
}
e outra classe com o mesmo nome mas dentro de um outro escopo (namespace)
namespace test.dummynamespace2
{
public class DummyClass { }
}
Tendo isso em mente, vc tem que analisar os modificadores de acesso:
Se vc define uma class como public, significa que pode ser instanciada por qualquer outro lugar no mesmo assembly e em um assembly diferente, desde que vc adicione uma referencia.
Se vc define uma classe como internal, significa que a classe soh pode ser acessada por codigo dentro do mesmo assembly.
Pensando no seu exemplo:
Vc criou uma biblioteca, criou uma classe definida como internal, entao ela nao vai ser visivel em outro assembly. Voce tera que mudar o modificador de acesso para public (como voce ja fez).
Entao, respondendo a sua pergunta, nao tem a ver com namespace e sim com modificadores de acesso da suas classes.
Entretanto, existe uma maneira de fazer internal classes visiveis em outros assemblies. Se vc especificar um assembly como “Friend”.
Voce pode ler mais sobre isso aqui:
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
Basicamente, vc especifica no assembly que tem internal types e membros qual assembly podera ter acesso a eles, vc faz isso atraves do atributo InternalsVisibleTo
Para saber mais : http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx
//Daniel
[quote=windsofhell]Ola,
Assembly, eh nada mais do que um arquivo que contem codigo compilado. Voce pode ter dois tipos de assemblies, pode ser um arquivo executavel (.exe) ou pode ser uma biblioteca (.dll).
Namespaces, tem a ver com escopo das suas classes, eh uma forma de organizar as suas class e eh bastante util para evitar colisao de nomes, por exemplo, vc pode ter:
namespace test.dummynamespace1
{
public class DummyClass { }
}
e outra classe com o mesmo nome mas dentro de um outro escopo (namespace)
namespace test.dummynamespace2
{
public class DummyClass { }
}
Tendo isso em mente, vc tem que analisar os modificadores de acesso:
Se vc define uma class como public, significa que pode ser instanciada por qualquer outro lugar no mesmo assembly e em um assembly diferente, desde que vc adicione uma referencia.
Se vc define uma classe como internal, significa que a classe soh pode ser acessada por codigo dentro do mesmo assembly.
Pensando no seu exemplo:
Vc criou uma biblioteca, criou uma classe definida como internal, entao ela nao vai ser visivel em outro assembly. Voce tera que mudar o modificador de acesso para public (como voce ja fez).
Entao, respondendo a sua pergunta, nao tem a ver com namespace e sim com modificadores de acesso da suas classes.
Entretanto, existe uma maneira de fazer internal classes visiveis em outros assemblies. Se vc especificar um assembly como “Friend”.
Voce pode ler mais sobre isso aqui:
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
Basicamente, vc especifica no assembly que tem internal types e membros qual assembly podera ter acesso a eles, vc faz isso atraves do atributo InternalsVisibleTo
Para saber mais : http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx
//Daniel[/quote]
Obrigado, Daniel!!
E se eu quiser criar várias classes no mesmo assembly? Devem estar no mesmo arquivo obrigatoriamente?
[quote=ECO2004]
Obrigado, Daniel!!
E se eu quiser criar várias classes no mesmo assembly? Devem estar no mesmo arquivo obrigatoriamente?[/quote]
Pra fazer isso eh tranquilo. Na verdade voce pode adicionar quantas classes voce quiser dentro de um projeto, qualquer tipo de projeto, as classes criadas vao ficar dentro do mesmo assembly para o projeto.
Mas me parece que voce quer criar uma biblioteca nao eh mesmo? Quando voce criar um projeto eh soh escolher tipo chamado “Class Library” ai eh soh criar as classes normalmente. Nao tem misterio.
[quote=windsofhell][quote=ECO2004]
Obrigado, Daniel!!
E se eu quiser criar várias classes no mesmo assembly? Devem estar no mesmo arquivo obrigatoriamente?[/quote]
Pra fazer isso eh tranquilo. Na verdade voce pode adicionar quantas classes voce quiser dentro de um projeto, qualquer tipo de projeto, as classes criadas vao ficar dentro do mesmo assembly para o projeto.
Mas me parece que voce quer criar uma biblioteca nao eh mesmo? Quando voce criar um projeto eh soh escolher tipo chamado “Class Library” ai eh soh criar as classes normalmente. Nao tem misterio.[/quote]
Obrigado!!!