Pergunta

Eu preciso recriar um provedor no meu arquivo web.config que é algo como isto:

<membership defaultProvider="AspNetSqlMemProvider">
  <providers>
    <clear/>
    <add connectionStringName="TRAQDBConnectionString" applicationName="TRAQ" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0"
         name="AspNetSqlMemProvider"
         type="System.Web.Security.SqlMembershipProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
    />
  </providers>
</membership>

No entanto, eu recebo um erro de execução dizendo que esta assembleia não pode ser carregado, e eu acho que é porque eu tenho o PublicKeyToken errado. Como faço para procurar o PublicKeyToken para minha montagem?

Como alternativa, eu vou completamente o caminho errado com isso?

Foi útil?

Solução

Usando PowerShell , você pode executar a seguinte declaração:

([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

A saída irá fornecer o Versão , Cultura e PublicKeyToken , como mostrado abaixo:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

Outras dicas

Usando sn.exe utilidade :

sn -T YourAssembly.dll

ou carregar o conjunto em reflector .

Se você tem a DLL adicionado ao seu projeto, você pode abrir o arquivo csproj e ver a tag de referência.

Exemplo:

<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

sn -T <assembly> na linha de comando Visual Studio. Se um assembly está instalado no cache de assembly global, é mais fácil ir para C:\Windows\assembly e encontrá-lo na lista de conjuntos GAC.

No seu caso específico, você pode estar misturando nome completo tipo com referência de montagem, você pode querer dar uma olhada em MSDN .

A resposta é muito simples utilização do .NET Framework ferramentas sn.exe. Então abra o Visual Studio 2008 Command Prompt e em seguida, aponte para a pasta do dll você deseja obter a chave pública,

Use o comando a seguir,

sn –T myDLL.dll

Isto lhe dará a chave pública token. Lembre-se de uma coisa que este só funciona se a montagem tem de ser fortemente assinado.

Exemplo

C:\WINNT\Microsoft.NET\Framework\v3.5>sn -T EdmGen.exe

Microsoft (R) .NET Framework Strong Name Utility  Version 3.5.21022.8
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key token is b77a5c561934e089

Eu uso o Windows Explorer, navegue até C: \ Windows \ assembly, encontrar a necessidade que eu. A partir de Propriedades você pode copiar o PublicKeyToken.

Isto não contar com Visual Studio ou quaisquer outros utilitários que está sendo instalado.

Basta adicionar mais informações, eu não era capaz de encontrar sn.exe utilidade nos locais mencionados, no meu caso foi em C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). FullName

resultará em

System.Data, versão = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089

Você também pode verificar pelo seguinte método.

Go to Run: digite o caminho da DLL para o qual você precisa de chave pública. Você encontrará 2 arquivos: 1. __AssemblyInfo_.ini 2. arquivo DLL

abrir este arquivo __AssemblyInfo_.ini no bloco de notas, aqui você pode ver Public Key token.

Como @CRice disse que você pode usar o abaixo método para obter uma lista de assembly dependente com publicKeyToken

public static int DependencyInfo(string args) 
{
    Console.WriteLine(Assembly.LoadFile(args).FullName);
    Console.WriteLine(Assembly.LoadFile(args).GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).SingleOrDefault());
    try {
        var assemblies = Assembly.LoadFile(args).GetReferencedAssemblies(); 

        if (assemblies.GetLength(0) > 0)
        {
            foreach (var assembly in assemblies)
            {
                Console.WriteLine(" - " + assembly.FullName + ", ProcessorArchitecture=" + assembly.ProcessorArchitecture);             
            }
            return 0;
        }
    }
    catch(Exception e) {
        Console.WriteLine("An exception occurred: {0}", e.Message);
        return 1;
    } 
    finally{}

    return 1;
}

i geralmente usá-lo como um LinqPad roteiro você pode chamá-lo como

DependencyInfo("@c:\MyAssembly.dll"); a partir do código

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