小编Dom*_*Eav的帖子

麻烦的GC.collect()调用第三方库

在分析我的应用程序(C#,.NET 4)时,我注意到我使用的第三方库显式调用GC.Collect().这非常令人讨厌,因为它有时会对我的应用程序性能产生巨大影响,因为对这个库的一些调用最终会产生巨大的循环:在GC.Collect中花费的时间占总执行时间的80%以上.

当然,我向库维护者报告了这种行为(lib不是开源的),但是当他们正在开发新版本时,我想优化我的应用程序.我能做什么?

我尝试通过将GCSettings.LatencyMode设置为GCLatencyMode.LowLatency来配置GC(当然,仅在执行库调用期间),但无济于事.我宁愿避免分叉我的过程.

有任何想法吗?

.net c# performance profiling garbage-collection

10
推荐指数
1
解决办法
333
查看次数

Windows CryptoAPI:带有CALG_SHA_256的CryptSignHash和来自MY keystore的私钥

我试图在Windows上生成数字签名(来自XP SP3,但目前正在使用Windows 7进行测试),其中CryptoAPI将与以下openssl命令兼容:

openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)
Run Code Online (Sandbox Code Playgroud)

我想使用Windows"MY"密钥库中的私钥进行签名.

我设法使用SHA1摘要算法使用以下CryptoAPI函数签署文件(为简洁省略参数):

CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)

生成的签名与"openssl dgst -sha1 -verify"兼容(一旦字节顺序颠倒).

我的问题是:当我尝试将CALG_SHA_256与CryptCreateHash一起使用时,它会因错误80090008(NTE_BAD_ALGID)而失败.通过谷歌搜索左右,我发现,我需要使用特定的提供者(PROV_RSA_AES),而不是默认的一个.由于我有一个提供者句柄,我还需要用CryptGetUserKey替换CryptAcquireCertificatePrivateKey.所以我修改了我的程序,看起来像:

CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有按预期工作:CryptGetUserKey失败,错误8009000D(NTE_NO_KEY).如果我删除了CryptGetUserKey调用,程序将一直运行,直到CryptSignHash失败,错误80090016(NTE_BAD_KEYSET).我知道密钥集确实存在并且工作正常,因为我能够使用它来签署SHA1摘要.

我尝试使用从CertFindCertificateInStore获得的证书上下文中的信息再次获取上下文:我能做的最好的是成功的CryptGetUserKey调用,但CryptSignHash总是会失败并出现相同的错误.

我试图使用的私钥是2048位长,但我不认为它是一个问题,因为它与SHA1摘要一起使用.我很茫然,所以任何建议都会非常受欢迎!

cryptography rsa sha256 cryptoapi digital-signature

3
推荐指数
2
解决办法
1万
查看次数