Я только что рассмотрел это на устройстве MC9090, которое также использует библиотеки символов (не уверены, что они одинаковые, но это стоит того, чтобы сделать снимок). Я использовал отражение, потому что у меня есть устройства от разных производителей и вы хотите, чтобы один и тот же код работал. Вы можете получить доступ к этой области непосредственно из собственности или использование отражения:
Вот где свойство:
Symbol.ResourceCoordination.Terminalinfo.ESN
Вот мой метод с помощью отражения:
try
{
Assembly symbolApi = Assembly.LoadFrom("Symbol.ResourceCoordination.dll");
Type terminalInfo = null;
foreach (Type t in symbolApi.GetTypes())
{
if (t.Name == "TerminalInfo")
{
terminalInfo = t;
break;
}
}
LogService.log(terminalInfo.Name);
if (terminalInfo != null)
{
object objTerminalInfo = Activator.CreateInstance(terminalInfo);
PropertyInfo esn = null;
foreach (PropertyInfo info in terminalInfo.GetProperties())
{
if (info.Name == "ESN")
{
esn = info;
break;
}
}
if (esn != null)
{
object objSn = esn.GetValue(objTerminalInfo, null);
sn = objSn.ToString();
}
}
else
LogService.log("TerminalInfo type not found in " + symbolApi.FullName);
}
catch (MissingFieldException e)
{
LogService.log("MissingFieldException, not Symbol Unit: " + e.Message);
}
catch (Exception e)
{
LogService.log("Error in SymbolAPI: " + e.Message);
}
Надеется, что это помогает!
Почему все для/каждого цикла? Почему бы не использовать GetType (string) для получения типа TerminalInfo и аналогично GetProperty (строка), чтобы получить свойство ESN? И поскольку ESN, по-видимому, никогда не изменится, я бы рекомендовал кэшировать значение, полученное после его получения, чтобы предотвратить это более одного раза. – ctacke
Я сделал кеш этого и только вызвал его, если у меня его еще не было. Петли for/each были вызваны тем, что метод GetType (string) возвращал значение null, и я не мог занять слишком много времени, чтобы понять, почему. – IronicMuffin