Как изменить значение атрибута «uSNChanged» System.DirectoryEntry на Int64

Я пытаюсь получить значение Int64 для объекта служб каталогов "uSNChanged" значение. К сожалению, он всегда возвращается в качестве COM-объекта. Я пытался использовать приведение к Int64, вызов Int64.Parse () и вызов Convert.ToInt64 (). Ни одна из этих работ.

Для данного объекта DirectoryEntry этот код будет отображать свойства:

    private static void DisplaySelectedProperties(DirectoryEntry objADObject)
    {
        try
        {
            string[] properties = new string[] {
                "displayName",
                "whenCreated",
                "whenChanged",
                "uSNCreated",
                "uSNChanged",
            };

            Console.WriteLine(String.Format("Displaying selected properties of {0}", objADObject.Path));
            foreach (string strAttrName in properties)
            {
                foreach (var objAttrValue in objADObject.Properties[strAttrName])
                {
                    string strAttrValue = objAttrValue.ToString();
                    Console.WriteLine(String.Format("   {0, -22} : {1}", strAttrName, strAttrValue));
                }
            }
            Console.WriteLine();
        }
        catch (Exception ex)
        {
            throw new ApplicationException(string.Format("Fatal error accessing: {0} - {1}", objADObject.Path, ex.Message), ex);
        }
    }

Это вывод:

Displaying selected properties of LDAP://server/o=org/cn=obj
   displayName            : Display Name
   whenCreated            : 7/8/2009 7:29:02 PM
   whenChanged            : 7/8/2009 10:42:23 PM
   uSNCreated             : System.__ComObject
   uSNChanged             : System.__ComObject

Как мне преобразовать этот System .__ ComObject в Int64?

Solution Used:

Это решение, которое я использовал, основано на решении marc_s ниже:

    public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
    {
         var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
         var lowPart  = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart",  System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
         return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
    }

Ответы на вопрос(2)

Решение Вопроса

расфокусированный который написан на C #:

Int64 iLargeInt = 0;

IADsLargeInteger int64Val = (IADsLargeInteger)oPropValue.LargeInteger;
iLargeInt = int64Val.HighPart * 4294967296 + int64Val.LowPart;

Насколько я могу сказать, это должно работать просто отлично.

Марк

 Simon Gillbee09 июл. 2009 г., 19:53
Для людей, желающих использовать это решение, вам необходимо включить ссылку COM на ActiveDs в ваш проект, потому что IADsLargeInteger не является нативным интерфейсом .NET. Это прекрасно работает! Для моего решения я не хотел вводить ссылку на ActiveD, поэтому я сделал похожее решение, но использовал магию отражения. Смотрите мой отредактированный вопрос для решения, на котором я остановился
 06 июл. 2011 г., 20:58
iLargeInt = ((Int64)int64Val.HighPart) << 32 + int64Val.LowPart; было бы лучше

IADsLargeInteger введите, поэтому для извлечения значений потребуется немного магии взаимодействия.Эта тема содержит пример реализации VB - и упоминает о проблемах, похожих на вашу собственную, - однако я уже не в состоянии проверить его полезность прямо сейчас. Надеюсь это поможет.

 Simon Gillbee09 июл. 2009 г., 19:56
Спасибо за ответ. Вы тоже правы, но я пометил ответ Марка как правильный, поскольку он фактически предоставил исходный фрагмент.

Ваш ответ на вопрос