如何找到的公钥对特定的dll?
-
19-09-2019 - |
题
我需要重新在我的web.config文件的提供者,看起来是这样的:
<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>
不过,我得到一个运行时错误说这集不会被加载,我想这是因为我有错误的公钥。我看上去怎么样了公钥对我的组装?
另外,我该怎么完全与这个错误的方式?
解决方案
使用的的PowerShell 上,您可以执行以下语句:
([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName
的输出将提供版,文化和公钥,如下所示:
MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
其他提示
如果你有DLL添加到您的项目,你可以打开的csproj文件,请参见参考标签。
示例:
<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
sn -T <assembly>
在Visual Studio中的命令行。
如果一个组件安装在全局程序集缓存,它更容易去C:\Windows\assembly
,发现它在GAC组件列表中。
在您的特定情况下,你可能会被混合型全名与装配基准,你可能想看看的 MSDN 。
答案很简单,使用.NET Framework工具sn.exe
。因此,打开Visual Studio 2008的命令提示符,然后指向DLL的文件夹,你想要得到的公共密钥,
使用下面的命令,
sn –T myDLL.dll
这会给你的公钥标记。记住一点这只是工作,如果装配有强烈签署。
实施例
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
我使用Windows资源管理器,浏览到C:\ WINDOWS \组装,找到一个我需要的。从属性,你可以复制公钥。
这不依赖于Visual Studio或任何其它实用程序被安装。
只是添加更多的信息,我没能找到所提到的地点SN.EXE工具,在我的情况下,它是在C:\ Program Files文件(x86)的\微软的SDK \的Windows \ v7.0A \ BIN
Assembly.LoadFile(@ “C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \ system.data.dll中”)。全名
会导致
System.Data,版本= 4.0.0.0,Culture =非 公钥= b77a5c561934e089
您还可以通过以下方法进行检查。
去跑:输入DLL在您需要的公共密钥的路径。 你会发现2个文件: 1. __AssemblyInfo_.ini 2. DLL文件
用记事本打开该文件__AssemblyInfo_.ini,在这里你可以看到公钥标记。
正如@CRice说可以使用以下方法来获得从属组件的列表,包括公钥
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;
}
我通常使用它作为一个 LinqPad 脚本 可以调用它作为
从代码DependencyInfo("@c:\MyAssembly.dll");