Pergunta

Eu estou ciente das seguintes dois tipos diferentes de projetos web no Visual Studio 2008:

  • Projeto de Website
  • Projeto de aplicativo da Web

Um projeto de aplicativo da web pode fazer referência a um assembly assinado contanto que o aplicativo web da assembleia é, também, assinado com a mesma chave.No entanto, isso não funciona com o projeto de site, porque não há lugar para assinar um assembly.Eu acho que isso é porque o assembly compilado dinamicamente no servidor?

De qualquer maneira, é possível obter o website do projecto de trabalho com este assembly assinado?Ou será que vou ter que converter este projeto de website em um projeto de aplicativo da web?

Editar:

A seguinte situação tem exigido de mim para pedir esclarecimentos sobre este assunto:

Eu tenho uma biblioteca de classe que está sendo referenciado por vários outros projetos em minha solução no Visual Studio.Um dos projetos é um aplicativo do windows que será implantado específicos de usuários externos.A fim de se certificar de que o aplicativo está usando a montagem correta e também para impedir que outras pessoas utilizem a montagem (eu estou ciente das limitações com relação a sua eficácia), todos os conjuntos foram assinados e todas as classes na biblioteca de são declaradas como Amigo (interno).

O projeto de website, não parece ter uma forma para que eu assinasse a sua montagem e recebo a seguinte mensagem ao tentar usar qualquer coisa da biblioteca:"CLASSE não está acessível neste contexto porque ele é 'Amigo'", o que seria de esperar.

Os seguintes atributos são dentro do AssemblyInfo.vb arquivo em meu projeto de biblioteca de classe:

<Assembly: InternalsVisibleTo("OtherProject1, PublicKey=AAA...")>
<Assembly: InternalsVisibleTo("OtherProject2, PublicKey=AAA...")>
...

Minha Conclusão:

Parece que a maneira mais para fazer isso seria converter o website em um aplicativo da web, mas isso requer um pouco de tempo para fazer, já que nosso site está muito aprofundados e como já apontado em outras discussões, pode ser uma grande dor para o fazer.Daqui para frente, eu acho que a criação de um aplicativo web, em primeiro lugar, pode ter sido uma idéia melhor e mais flexível para o desenvolvimento futuro.

Foi útil?

Solução

Não há nenhuma exigência para os dois projetos a ser assinado com a chave, depois de todo o quadro conjuntos são todos assinados com o MS-chave, o qual você não tem acesso a mas felizmente você pode fazer referência a eles a partir de Sites da Web e projetos de aplicativos Web.

Não há nada que impeça você de fazer referência a um assembly assinado a partir de um projeto de Site - quais os erros que você está vendo?


Editar para adicionar

Na luz de suas informações atualizadas, sim, eu acho que você terá que:

  1. Converta o site da web em um aplicativo web, como apontam corretamente, não há nenhuma maneira para assinar o site, e, de fato, não há nenhum controle real sobre as bibliotecas que ASP.NET vai gerar para o site.
  2. Compilar duas versões da biblioteca de classe, assinado, o outro não.Você provavelmente poderia usar a compilação condicional para conseguir isso.

Editar para adicionar

Eu acho que a compilação condicional provavelmente vai acabar ficando confuso rapidamente, mas em breve ele iria trabalhar como esta:

  • Abra as Propriedades do Projeto para a biblioteca de classe, e vá para o separador Criar.
  • Mudar a "Configuração" do menu suspenso para "Todas as Configurações"
  • Em "símbolos de compilação Condicional" caixa, adicionar um novo símbolo, tal como "INTERNOS".

Ir para as bibliotecas de classe que você deseja tornar público, e modificá-los para algo como:

#if INTERNAL
  internal class MyClass
#else
  public class MyClass
#endif
  {
    [...]
  }

Então, quando você precisa para produzir a versão Pública da biblioteca, remova o "INTERNO" símbolo das propriedades e reconstruir - você poderia fazer isso mais fácil através da criação de um novo conjunto de configurações de Depuração e Liberação que tenham este símbolo definido, e alternar entre eles usando a Configuração de Solução suspensa.

Possíveis problemas:

  1. Pode não ser fácil de dizer se você tem o símbolo definido ou não - eu não sei o que o comportamento é de baunilha VS, no entanto com o ReSharper instalado, ele irá cinza para fora as partes do código que não será compilado sob o atual conjunto de símbolos, bandeiras e a classe como inacessível medida que você digita.
  2. Você vai querer deixar suas propriedades e métodos de public de modo que, quando você não construí-lo como "INTERNO", tem acesso a eles, mas isso vai parecer um pouco estranho (apesar de não produzir quaisquer avisos tão claramente é legal).

Outras dicas

Agora que eu tenho uma visão mais clara do problema que eu vejo que a minha resposta original não se aplica bem.O que eu fiz antes, em uma situação semelhante foi a utilização de controle de origem para o ramo os ficheiros de código para o "Amigo" classes no projeto consumo, de modo que eles compilar como parte do consumidor da assembleia.

No meu caso, eu estava a tentar reutilizar o código em diferentes servidor de controle de projetos, sem colocar em uma dll separada, mas eu suspeito que ele também funciona bem para o seu website cenário.Isso significaria o seu web site não tem necessidade de referência assinado DLL porque as classes são compiladas como parte do site e, portanto, todos os internos declarações devem estar disponíveis para ele.

Eu não sei se isso seria uma opção para você ou não, depende em grande parte de origem ferramenta de controle de utilizar, como você tem o seu repositório de código configurar, e como você está confortável com a ramificação e mesclagem do conceito.

Membros públicos de uma assinado montagem deve estar disponível para qualquer outro projeto que tem o acesso para a DLL.Eu criei vários assemblies assinados e distribuída para outros membros da minha equipe, nós tê-los usado em uma mistura de sites, projetos web e aplicações de console.O único lugar que tive um conflito foi quando tentamos usar um assembly referenciado HttpContext.Corrente em um aplicativo de console.Mesmo que trabalhou, se evitamos os métodos que utilizaram esta referência.

O único caso em que a assinatura/chaves deve ser um problema se você está tentando torná-los "Amigos", o que significa que eles podem ver eachothers interno tipos e métodos.As regras sobre os amigos e a assinatura está documentado aqui: http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx

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