.net - 您如何以编程方式(重新)签署具有强名称的 .NET 程序集?

标签 .net strongname

除了调用命令行向程序集添加强名称之外,是否有任何 API 可以让您在程序集被剥夺其强名称后退出该程序集?

最佳答案

这取决于您所说的“剥夺其强名称”的程序集是什么意思。如果程序集没有强命名,则在使用强名称重新构建程序集之前,没有任何东西(甚至 sn.exe)可以退出程序集。

但要回答您的问题:所有强大的命名功能都通过 CLR 的 unmanaged strong naming API 公开。 .具体来说,你想要 StrongNameSignatureGenerationEx ,您会注意到,它在功能上等同于 sn -R[a]命令。

话虽如此,调用 sn.exe 更简单、更容易。本身。访问非托管强名称 API 并不适合胆小的人,因为(从 .NET 4 开始)您必须首先通过 CLR 的元托管 API。出于这个原因,您也几乎不得不完全在非托管代码中执行此操作。 (我确实找到了 managed wrapper from Microsoft on CodePlex ,但我无法让 StrongNameSignatureGenerationEx 通过它正常工作。)

但是,如果您必须这样做,以下是如何从非托管代码访问强命名 API 的粗略概述:

  • 获取 ICLRMetaHost 的实例或 ICLRMetaHostPolicy调用 CLRCreateInstance .
  • 使用该实例,获取当前运行时的实例(即 ICLRRuntimeInfo 实例)。有很多方法可以做到这一点;见 MSDN血淋淋的细节。
  • 一旦你有 ICLRRuntimeInfo 的实例, 获取 ICLRStrongName 的实例调用 ICLRRuntime GetInterface 方法,传入CLSID_CLRStrongNameIID_ICLRStrongName对于类/接口(interface)标识符。

  • 现在您有了 ICLRStrongName 的实例,您终于可以调用StrongNameSignatureGenerationEx使用它:
    // This is the ICLRStrongName instance you'll need. Assume GetStrongNameAPI
    // corresponds to an implementation of the rough process I outlined above.
    ICLRStrongName *snAPI = GetStrongNameAPI();
    
    // You'll have to load the .snk file into memory yourself using the Win32
    // file APIs, the details of which I've omitted for the sake of brevity.
    BYTE *keyPairBlob = NULL;
    DWORD keyPairBlobSize = 0;
    LoadKeyPair(&keyPairBlob, &keyPairBlobSize);
    
    // Once you've got the key pair blob, you can now (re-)sign the assembly
    HRESULT hr = snAPI->StrongNameSignatureGenerationEx(
        L"path\\to\\your\\assembly.dll", 
        NULL,
        keyPairBlob,
        keyPairBlobSize,
        NULL,
        NULL,
        0
    );
    
    // Do whatever error handling needs to be done with the given HRESULT
    

    (或者,如果您想使用 key 容器而不是 .snk key 对进行签名,您可以将 key 容器的名称作为第二个参数传入,并将 key 对 blob/size 参数保留为 NULL。)

    底线:如您所见,除非您真的必须通过强大的命名 API,否则仅通过调用 sn.exe 本身来(重新)签署程序集要容易得多。

    关于.net - 您如何以编程方式(重新)签署具有强名称的 .NET 程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/692565/

    相关文章:

    visual-studio-2008 - VS 2008 中的 Wrapper Assembly Key File 设置在哪里?

    .net - 如何将 StrongName KeyPair 与受密码保护的 key 文件 (pfx) 一起使用?

    html - 如何使用文本字体百分比而不是文本图像进行响应式设计?附上我的代码

    c# - 禁用 "azure-jobs-host-output"/"azure-webjobs-hosts/output-logs"消息

    .net - 如何使用 Moq 模拟输出参数?

    c# - 将 BeginTransaction 与 Dapper.IDbConnection 一起使用的正确方法

    .net - 向开源项目的源代码管理添加强名称 key 有任何安全问题吗?

    C# - 使用强名称不保护程序集

    redis - Microsoft.AspNet.SignalR.Redis 需要 StackExchange.Redis.StrongName,但是 StackExchange.Redis.Extensions.Core 需要 StackExchange.Redis

    c# - 使用 Oracle.ManagedDataAccess 连接到 Oracle