除了调用命令行向程序集添加强名称之外,是否有任何 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_CLRStrongName
和 IID_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/