7
根據我在文檔中的理解,如果失敗,它將返回null,但在我看來,每個失敗場景都有一個異常。Registry.CreateSubKey何時返回null?
在什麼標準的情況下,這個函數實際上會返回一個空值?
根據我在文檔中的理解,如果失敗,它將返回null,但在我看來,每個失敗場景都有一個異常。Registry.CreateSubKey何時返回null?
在什麼標準的情況下,這個函數實際上會返回一個空值?
如果你看看通過反射器的代碼,你會看到,如果從本地方法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。可能是因爲底層的系統調用失敗...... – Grzenio 2010-06-17 10:37:30
好主意.. 按照這個方法很複雜,但它完成了以下兩行: BCLDebug.Assert(false,「RegistryKey中的意外代碼路徑: :CreateSubKey「); 返回null; 所以我想沒有「正常」的調用應該導致null。 resharper只是沒有看到它,並警告空返回值。我會安全地忽略它。 – 2010-06-17 10:41:19