Fornecer explicitamente um Nome de Assembly para um Compilado Dinamicamente ASP.NET Site da Pasta App_Code?

StackOverflow https://stackoverflow.com/questions/9520231

Pergunta

Em um compilado dinamicamente ASP.NET projeto de Website, pode a assembleia para a pasta App_Code ser explicitamente chamado?

Por exemplo, em circunstâncias regulares, quando eu executar um ASP.NET site o nome do assembly gerado no Temporary ASP.NET Files\ pasta é parcialmente randomizados como App_Code.neizakfo.dll onde neizakfo é a parte que pode diferir.Posso fornecer explicitamente um nome para o conjunto, como App_Code_Web1.dll?

Esclarecimento

Por requisitos de negócio, o site não pode ser pré-compilados/implantado.Portanto, eu estou em busca de uma solução no contexto do Temporary ASP.NET Files pasta e dinamicamente assemblies compilados, como mencionado acima.


Fundo:
Me deparei com essa pergunta, enquanto procura uma maneira de executar a dinâmica tipo de instanciação de uma classe na pasta App_Code de um web site através de uma assembleia-qualificado nome armazenado na configuração, mas instanciado a partir da página web, assim, a travessia de uma assembleia limite.Porque a página da web e app_code código compilado em duas diferentes conjuntos por padrão, o Tipo.GetType(..) o método do padrão de comportamento de busca para o nome do Tipo no atual em execução de montagem (página da web) ou em mscorlib não basta para escolher qualquer Tipo de App_Code assembleia.Sendo randomizados, app_code nome do assembly não é conhecida por me incluir na assembleia qualificado de seqüência de caracteres.

Eu posso colocar o Tipo de dados em uma biblioteca de classe (porque tem uma predefinidas/nome exato) para se livrar deste problema, no entanto, eu gostaria de saber como fazer isso dentro do próprio site, sem a criação de um projeto de biblioteca de classe para o efeito.

Foi útil?

Solução

Você pode classificar de fazer isso em um projeto de WebSite.

Há um Artigo do MSDN sobre como utilizar o -fixednames bandeira quando compilar o projecto.

Isso efetivamente cria um assembly para cada página - default.aspx.dll.No entanto, esta é apenas marginalmente mais úteis para você como você ainda precisa saber o nome do controle ou a página que você está procurando quando você estiver carregando - então você tem que garantir que seus tipos e nomenclatura é consistente.Ele deve, no entanto, respeitar o nome das classes em app_code então isso pode funcionar para você.

Uma outra coisa que você poderia fazer é mover todos do código app_code fora na própria assembleia e, em seguida, acrescentar que, como um projecto de referência.Que também iria simplificar este problema.

Por fim, você poderia enumerar todos os dll na pasta bin, e procurar cada um para o tipo que você está procurando.Como este é bastante caro, faça isso uma vez, e armazenar em cache o resultado em algum lugar para não continuar a fazê-lo toda vez que você olhar que tipo de backup.Este é, provavelmente, a pior solução.

Este é trivial fazer em um WebApplication projeto, mas eu suponho que você está preso com o Site um?

EDITAR: Como uma atualização para os comentários;se eu usar a Publicar a Ferramenta da Web e, em seguida, todos do código app_code vai no diretório bin em uma dll chamada App_Code.dll - este comportamento não é alterado, mesmo se eu usar fixo de nomenclatura (fixos todos os efeitos de atribuição de nomes a atribuição de nomes de dll para cada página, usercontrol).Se eu usar ILSpy neste arquivo, eu posso ver o meu classes de lá.Assim que eu souber o nome do conjunto, e sua localização - eu deveria ser capaz de obter o tipo no-lo com o mínimo de esforço.Eu me pergunto por que eu estou vendo um comportamento diferente para você!

Eu criei uma classe simples chamada "Pessoa" com um Id e Nome, colocá-lo em App_Code, compilado do site, e, em seguida, executou o seguinte código:

  Type myType = Assembly.LoadFrom(Server.MapPath("~/bin/App_Code.dll")).GetType("Person", true);
  Response.Write(myType.ToString());

Ele escreveu "Pessoa", como esperado.

Editar

Penny cai!Se eu, então, de fazer:

  object myObject= Activator.CreateInstance("App_Code.dll", "Person");

E tentar deixar de myObject para pessoa, eu recebo a seguinte mensagem:

The type 'Person' exists in both 'App_Code.dll' and 'App_Code.jydjsaaa.dll'

Então é hora de ser desonesto.

no Global.asax, no Application_OnStart, faça o seguinte:

Application["App_Code_Assembly"] = Assembly.GetAssembly(typeof(Person));

No meu teste padrão de página, então eu fiz:

  Assembly app_Code = Application["App_Code_Assembly"] as Assembly;
  Response.Write(app_Code.FullName);

O que me deu o nome aleatório app_code é, na verdade, executando com Temporários ASP.Net Ficheiros.

É por isso que eu odeio Projetos de Site ;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top