C# UWP项目中使用Certificate Enrollment API的可行性及问题咨询
UWP中能否使用CertEnroll API?
问题背景与遇到的错误
- 环境:x64架构的C# UWP打包项目,尝试引用
Windows\SysWow64路径下的CertEnroll.dll和certcli.dll,编写代码如下:
using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using CERTCLILib; using CERTENROLLLib; ... CCspInformation cspInformation = new CCspInformationClass(); cspInformation.InitializeFromName(CngProvider.MicrosoftSoftwareKeyStorageProvider.Provider);
编译错误:返回CS1752:“Interop类型‘CCspInformationClass’无法嵌入,请改用适用的接口”。将项目文件中
EmbedInteropTypes属性设为false后编译成功,但调试时抛出异常:无法加载程序集‘Interop.CERTENROLLLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’,系统找不到指定文件。后续尝试及异常:移除
CertEnroll.dll引用,手动添加Interop.CERTENROLLLib.dll并配置:
<ItemGroup> <Reference Include="Interop.CERTENROLLLib"> <HintPath>\.\Interop.CERTENROLLLib.dll</HintPath> <EmbedInteropTypes>False</EmbedInteropTypes> </Reference> </ItemGroup>
调试时创建CERTENROLLLib.CCspInformationClass实例抛出COMException:使用CoCreateInstanceFromApp创建CLSID为{884E2007-217D-11DA-B2A4-000E7BBB2B09}的COM组件实例失败,错误80040154:类未注册(HRESULT异常:0x80040154 (REGDB_E_CLASSNOTREG))。
- 其他尝试:使用
regsvr32注册组件提示“找不到入口点”,regasm注册提示“无法加载文件,因为它不是有效的.NET程序集”;切换项目目标平台为x86后程序崩溃。该API在常规.NET项目中可正常运行。
结论
CertEnroll相关的传统COM组件无法直接在UWP项目中使用,核心原因如下:
- UWP运行在沙箱环境中,对系统级COM组件的访问有严格限制,CertEnroll不在UWP允许调用的API范围内,常规方式无法突破沙箱限制。
- 手动添加互操作程序集后,会因为沙箱内无法注册COM组件、组件访问权限不足等问题,导致实例化失败,出现类未注册的错误。
若需在UWP中实现证书相关功能,应使用UWP专属的Windows.Security.Cryptography.Certificates命名空间下的API,该API完全适配UWP沙箱环境,支持证书创建、管理、导入导出等常见操作。
内容的提问来源于stack exchange,提问作者Stanislav
相关产品推荐
相关产品推荐

