是否有可能检查当前已经与您自己运行的应用程序进程分开运行的.NET应用程序的强名称?
编辑:为了澄清,一个不需要硬编码路径到执行组件的解决方案将是最理想的解决方案.
编辑#2:没有使用反射有没有办法做到这一点?
我有一个使用动态代码生成来创建代理类的项目。该代理类利用项目的内部类(以便不暴露实现细节),因此我将InternalsVisibleTo 与动态生成的程序集的名称一起使用。直到最近,当我的客户强行要求所有交付的程序集都必须是强名称时,这种方法一直运行良好。
出现此问题的原因是,为了将 InternalsVisibleTo 与强名称程序集一起使用,它引用的程序集也必须是强名称的,并且您必须提供公钥。我遇到困难的是如何为动态生成的程序集提供强名称。这是我到目前为止所做的:
我尝试对动态生成的程序集进行签名,如下所示:
var name = new AssemblyName("ProxyBuilderAssembly");
var attributes = new CustomAttributeBuilder[1];
attributes[0] =
new CustomAttributeBuilder(typeof(AssemblyKeyFileAttribute).GetConstructor(new[] {typeof(string)}),
new object[] {"Dynamic.snk"});
_assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, attributes);
_module = _assembly.DefineDynamicModule("ProxyBuilderAssembly", "ProxyBuilderAssembly.dll");
Run Code Online (Sandbox Code Playgroud)不幸的是,这不起作用,我一直很难找到任何关于它如何工作的文档。有谁知道如何对动态生成的程序集进行签名,以便可以通过InternalsVisibleTo 对其进行访问?我可以将必要的类公开,但这最终会泄漏实现细节,而这些细节最好还是封装起来。
与 Windows 目录的 %WINDIR% 系统变量类似,我们是否有任何指向最新版本的 Microsoft SDK 文件夹的系统变量,以便我可以在构建脚本中访问 sn.exe?
我有一个使用第三方DLL的签名应用程序.这些DLL没有签名. - 到目前为止第一步没有问题:我刚刚签署了它们(使用ildasm.exe获取*.il,*.il中的publickeytoken,因为它们具有相互依赖关系,并使用ilasm.exe创建*.dll)
该项目现在编译良好,也启动.
但是在我的代码中,调用第三方DLL的类构造函数(或其他东西? - 这是我做的第一件事),我得到错误"强名称签名程序集必须在其中指定一个公钥InternalsVisibleTo声明"
如果你有DLL的源代码似乎没有问题,并且可以通过设置调整AssemblyInfo.cs
[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]
Run Code Online (Sandbox Code Playgroud)
但是:如上所述,我有一个第三方DLL我没有源.所以没办法像这样解决问题.
有什么建议让这个运行?
我对现有的.NET程序集dll中的代码进行了一些更改.我没有用于签署代码的密钥文件.如何在不删除StrongNames(Damages应用程序)的情况下强制.NET可执行文件加载它,而无需注册它以跳过验证(不可移植)?
我很好奇,通过谷歌研究,我一直在学习数字签名和强烈命名的程序集.如果您真的努力,似乎可以使用数字签名来签署强名称的程序集.
我推测,通过这种做法,可以通过这种方式使用它来规避数字签名的目的.
微软说:
"强名称本身并不意味着一种信任程度,例如通过数字签名和支持证书提供的信任."
- http://msdn.microsoft.com/en-us/library/wd40t7ad%28v=vs.110%29.aspx
我是否正确地猜测以这种方式使用数字签名实际上是一种不好的做法,这可能会造成安全漏洞并且绝对没有用处?或者甚至可能吗?使用数字签名作为强名称可能或更好然后什么都不做?除了正确使用数字签名之外,它是否提供了额外的安全性.
当我尝试签署程序集时,我收到以下错误:
错误1程序集生成失败 - 引用程序集"comlib"没有强名称
是否可以签署引用未签名的程序集的程序集,或者我是否也必须签署COM互操作程序集?
我用强名签了我的集会.
我是从VS2005解决方案资源管理器 - >程序集右键单击 - >签名完成的.
但仍然RedGate's .net reflector能够浏览代码.
那么汇编签名的用途是什么?
我正在尝试检查程序集是否是强名称签名.
以下是我的powershell脚本
function Get-AssemblyStrongName($assemblyPath)
{
[System.Reflection.AssemblyName]::GetAssemblyName($assemblyPath).FullName
}
$File = Get-ChildItem -Path $args[0] -Include @("*.dll","*.exe") -Recurse
Foreach ($f in $File)
{
$assembly=$f.FullName
Get-AssemblyStrongName $assembly
}
Run Code Online (Sandbox Code Playgroud)
输出如下.
Sampledll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 70ea1bb087B4tbed
如果publickeytoken为null,我认为它没有签名.我试图写条件如果条件
$Assembly=Get-AssemblyStrongName $assembly
If ($assembly -contains "null" ) { "assembly is not signed" }
Run Code Online (Sandbox Code Playgroud)
虽然许多exe或dll将publickey作为null但仍然没有显示输出,因为"程序集未签名".
如何检查if条件以查找publickeytoken是否为null?(或组装是否签署)
我的应用程序要求是使用签名程序集.我使用Visual Studio 2012命令工具签署了RestSharp程序集.应用程序构建成功,但运行时,会出现以下错误:
无法加载文件或程序集'RestSharp,Version = 104.4.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.需要一个强名称的程序集.(HRESULT异常:0x80131044)
这有什么解决方案吗?
strongname ×10
.net ×4
c# ×4
com ×1
dll ×1
dynamic ×1
interop ×1
msbuild ×1
powershell ×1
restsharp ×1
validation ×1