C# Registry.CreateSubKey何时返回null?
根据我在文档中的理解,如果失败,它将返回null,但在我看来,每个失败场景都有一个异常C# Registry.CreateSubKey何时返回null?,c#,registry,C#,Registry,根据我在文档中的理解,如果失败,它将返回null,但在我看来,每个失败场景都有一个异常 在什么标准情况下,此函数实际返回空值?如果通过反射器查看代码,您将看到如果从本机方法返回的Win32Native.RegCreateKeyEx()返回的不是0的错误代码,或者如果操作的结果是null,然后它会将null返回给您 如果使用了不正确的权限,可能会导致返回拒绝访问错误代码 此方法背后的代码如下所示: [ComVisible(false)] public unsafe RegistryKey Crea
在什么标准情况下,此函数实际返回空值?如果通过反射器查看代码,您将看到如果从本机方法返回的
Win32Native.RegCreateKeyEx()
返回的不是0的错误代码,或者如果操作的结果是null
,然后它会将null
返回给您
如果使用了不正确的权限,可能会导致返回拒绝访问错误代码
此方法背后的代码如下所示:
[ComVisible(false)]
public unsafe RegistryKey CreateSubKey(string subkey, RegistryKeyPermissionCheck permissionCheck, RegistrySecurity registrySecurity)
{
ValidateKeyName(subkey);
ValidateKeyMode(permissionCheck);
this.EnsureWriteable();
subkey = FixupName(subkey);
if (!this.remoteKey)
{
RegistryKey key = this.InternalOpenSubKey(subkey, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree);
if (key != null)
{
this.CheckSubKeyWritePermission(subkey);
this.CheckSubTreePermission(subkey, permissionCheck);
key.checkMode = permissionCheck;
return key;
}
}
this.CheckSubKeyCreatePermission(subkey);
Win32Native.SECURITY_ATTRIBUTES structure = null;
if (registrySecurity != null)
{
structure = new Win32Native.SECURITY_ATTRIBUTES();
structure.nLength = Marshal.SizeOf(structure);
byte[] securityDescriptorBinaryForm = registrySecurity.GetSecurityDescriptorBinaryForm();
byte* pDest = stackalloc byte[1 * securityDescriptorBinaryForm.Length];
Buffer.memcpy(securityDescriptorBinaryForm, 0, pDest, 0, securityDescriptorBinaryForm.Length);
structure.pSecurityDescriptor = pDest;
}
int lpdwDisposition = 0;
SafeRegistryHandle hkResult = null;
int errorCode = Win32Native.RegCreateKeyEx(this.hkey, subkey, 0, null, 0, GetRegistryKeyAccess(permissionCheck != RegistryKeyPermissionCheck.ReadSubTree), structure, out hkResult, out lpdwDisposition);
if ((errorCode == 0) && !hkResult.IsInvalid)
{
RegistryKey key2 = new RegistryKey(hkResult, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree, false, this.remoteKey, false);
this.CheckSubTreePermission(subkey, permissionCheck);
key2.checkMode = permissionCheck;
if (subkey.Length == 0)
{
key2.keyName = this.keyName;
return key2;
}
key2.keyName = this.keyName + @"\" + subkey;
return key2;
}
if (errorCode != 0)
{
this.Win32Error(errorCode, this.keyName + @"\" + subkey);
}
return null;
}
真奇怪。如果你真的很好奇,下载Reflector,找到这个方法,看看它是否/何时返回null。可能是因为底层系统调用失败…好主意。。遵循该方法相当复杂,但它以以下两行结束:BCLDebug.Assert(false,“RegistryKey::CreateSubKey中的意外代码路径”);返回null;所以我想没有一个“正常”的调用应该是空的。resharper只是没有看到它,并警告返回值为null。我可以放心地忽略它。