C# system.nullreferenceexception: 未将对象引用设置到对象的实例
publicstaticStringProductKey{get{returnDecodeProductKey(GetRegistryDigitalProductId);...
public static String ProductKey { get { return DecodeProductKey(GetRegistryDigitalProductId); } }
private static Byte[] GetRegistryDigitalProductId
{
get
{
try
{
byte[] digitalProductId = null;
RegistryKey registry = null;
registry = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false);
if (registry != null)
{
digitalProductId = registry.GetValue("DigitalProductId") as byte[];
registry.Close();
}
return digitalProductId;
}
catch (Exception excep)
{
return null;
}
}
}
private static String DecodeProductKey(Byte[] digitalProductId)
{
const int keyStartIndex = 52;
const int keyEndIndex = keyStartIndex + 15;
char[] digits = new char[]
{
'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
};
const int decodeLength = 29;
const int decodeStringLength = 15;
char[] decodedChars = new char[decodeLength];
ArrayList hexPid = new ArrayList();
for (int i = keyStartIndex; i <= keyEndIndex; i++)
{
hexPid.Add(digitalProductId);
}
for (int i = decodeLength - 1; i >= 0; i--)
{
// Every sixth char is a separator.
if ((i + 1) % 6 == 0)
{
decodedChars[i] = '-';
}
else
{
int digitMapIndex = 0;
for (int j = decodeStringLength - 1; j >= 0; j--)
{
int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
hexPid[j] = (byte)(byteValue / 24);
digitMapIndex = byteValue % 24;
decodedChars[i] = digits[digitMapIndex];
}
}
}
return new string(decodedChars);
}
#endregion PRODUCT KEY
以上代码在编译器里顺利通过,但是实际运行时报错,我debug了一下,发现是byteValue和digitMapIndex的问题,值为0....请问如何修改上述代码???? 展开
private static Byte[] GetRegistryDigitalProductId
{
get
{
try
{
byte[] digitalProductId = null;
RegistryKey registry = null;
registry = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false);
if (registry != null)
{
digitalProductId = registry.GetValue("DigitalProductId") as byte[];
registry.Close();
}
return digitalProductId;
}
catch (Exception excep)
{
return null;
}
}
}
private static String DecodeProductKey(Byte[] digitalProductId)
{
const int keyStartIndex = 52;
const int keyEndIndex = keyStartIndex + 15;
char[] digits = new char[]
{
'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
};
const int decodeLength = 29;
const int decodeStringLength = 15;
char[] decodedChars = new char[decodeLength];
ArrayList hexPid = new ArrayList();
for (int i = keyStartIndex; i <= keyEndIndex; i++)
{
hexPid.Add(digitalProductId);
}
for (int i = decodeLength - 1; i >= 0; i--)
{
// Every sixth char is a separator.
if ((i + 1) % 6 == 0)
{
decodedChars[i] = '-';
}
else
{
int digitMapIndex = 0;
for (int j = decodeStringLength - 1; j >= 0; j--)
{
int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
hexPid[j] = (byte)(byteValue / 24);
digitMapIndex = byteValue % 24;
decodedChars[i] = digits[digitMapIndex];
}
}
}
return new string(decodedChars);
}
#endregion PRODUCT KEY
以上代码在编译器里顺利通过,但是实际运行时报错,我debug了一下,发现是byteValue和digitMapIndex的问题,值为0....请问如何修改上述代码???? 展开
2个回答
展开全部
1.主要问题还是在这里,这个digitalProductId没有获取到值,因此是null
2.而这个变量的值作为参数传递到了DecodeProductKey()方法。这下子问题就出现了,因为这个的值是null,所以执行完for循环内的hexPid.Add(digitalProductId);后通过调试也发现,hexPid里的值也全是null。
3.因此执行int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];时报错说未将对象引用设置到对象的实例。实际上就是因为(byte)hexPid[j]这部分是null的原因。
4.解决方法:通过观察GetValue()方法的注释发现,因为注册表里不存在名称/值对,所以才返回null。因此去看一下注册表里的这个值是否存在吧。
5.PS:以上操作只是我复制代码后直接操作的,所以我的注册表什么的都是原样,可能对代码会存在一些影响。但我给出的问题大概存在位置是可以确定的。一个小技巧:通常报“未将对象引用设置到对象的实例”,多半是某个变量或对象的值为null。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询