Problema ao obter o AssemblyVersion em uma página da web usando Razor / MVC3

104

Estou usando o seguinte código em um rodapé em meu arquivo _Layout.cshtml para colocar os dados da versão AssemblyInfo no rodapé de cada página do meu site MVC3. Contudo:

@System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()

Apenas imprime no rodapé:

Revision 0.0.0.0

Quando eu modifiquei a vista para exibir todas as informações de montagem para a "Montagem em execução" usando o seguinte

@System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()

Que imprime o seguinte:

Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

Isso mostra que o "Executing Assembly" não é meu aplicativo principal, é a própria visualização.

Como obtenho as informações de montagem do aplicativo ACTUAL, não apenas as visualizações individuais?

Jay Stevens
fonte

Respostas:

218

cshtml / vbhtml é uma compilação dinâmica para montagem.

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version

que tal agora?

Takepara
fonte
15
E @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionpara todos os VB.NETers. Nós dois.
edhubbell
Também devo compartilhar meus elogios - no topo da minha história "mostrar o número de revisão no aplicativo para qa" junto com [assembly: AssemblyVersion ("1.0. *")] Eu recebo um número de compilação de boa aparência. Funciona bem.
nocarrier
4
Para sites WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Pode até funcionar sem o namespace padrão:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu
@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)retorna 3 das 4 partes da versão de montagem se alguém estiver curioso. Você pode variar entre 0 e 4.
Mafii
1
no dotnet core 2.1 isso funciona para mim: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}então<h1>Ver. @version</h1>
Leonard AB
16

Usar este ajudante funciona para mim:

    public static HtmlString ApplicationVersion(this HtmlHelper helper)
    {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var version = asm.GetName().Version;
        var product = asm.GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), true).FirstOrDefault() as System.Reflection.AssemblyProductAttribute;

        if (version != null && product != null)
        {
            return new HtmlString(string.Format("<span>{0} v{1}.{2}.{3} ({4})</span>", product.Product, version.Major, version.Minor, version.Build, version.Revision));
        }
        else
        {
            return new HtmlString("");
        }

    }
Jay
fonte
13

Isso funciona para mim. Sem precisar mencionar explicitamente o tipo.

@ViewContext.Controller.GetType().Assembly.GetName().Version
Haohmaru
fonte
5

Você precisa obter a montagem de um tipo no projeto:

typeof(MyType).Assembly.Whatever

Onde MyTypeestá qualquer tipo no próprio projeto MVC (por exemplo, um controlador ou modelo, ou a MvcApplicationclasse)

SLaks
fonte
Esta é, na verdade, uma resposta melhor do que a aceita da IMO, pois deixa claro que você está procurando por um Tipo que faz parte do assembly do seu aplicativo. Explica melhor a causa do problema.
Jim
4

Expandindo a resposta de takepara, se você quiser que um liner obtenha o AssemblyInformationalVersionAttribute de um MVC Razor View:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
jslatts
fonte
1

Você pode tentar usar GetCallingAssembly (). Não tenho certeza se isso é alto o suficiente na pilha de chamadas ou não, mas como o Razor realmente cria um assembly para cada visualização, é lógico que seu aplicativo seja o assembly de chamada para o assembly de visualização.

BAKeele
fonte
O conjunto Get Calling sobe um nível na árvore ... ainda não é bom.
Jay Stevens
1

para um controlador de API, usei isso com base em outras respostas

Version = GetType().Assembly.GetName().Version.ToString()
workabyte
fonte
0

Meu problema era que eu tinha renomeado o namespace depois e recebi o erro acima. O problema era a referência de namespace antigo em Views \ Web.config. Tive que mudar de Project.WebAPI17paraCompany.Project.WebAPI17

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Company.Project.WebAPI17" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
florian.isopp
fonte
-1

Você pode obtê-lo usando a propriedade Name conforme abaixo:

  @System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

é isso que você está procurando?

Matmat
fonte
-1

Vá para o Home Controller e apenas copie este código:

Renomear ActionResultpara String

public string Index()

   return typeof(Controller).Assembly.GetName().Version.ToString() ;

run view
prashant
fonte