Microsoft.Office.Interop.MSProject дает значение null во время выполнения, но имеет значение в отладчике Visual Studio.

У меня возникла странная проблема, связанная с общением с Microsoft.Office.Interop.MSProject. Я использую MSProject 2013 с Office.DLL v15 и Microsoft.Office.Interop.MSProject.DLL v15. Мы обновляем нашу программу, которая синхронизирует данные между нашим продуктом и проектом, чтобы использовать последние библиотеки DLL для поддержки MSProject 2013. Я собираюсь приложить изображения кода, чтобы вы могли видеть то, что вижу я.

У меня есть локальная переменная, которой присваивается значение Project с помощью класса Interop.

'Сборка Microsoft.Office.Interop.MSProject C:\Program Files (x86)\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.MSProject.dll'

Я ищу значение из Project.ProjectStart, которое, когда я использую окно просмотра, показывает значение.

Окно просмотра показывает значение для Project.ProjectStart = допустимое значение

НО, когда код действительно выполняется, значение Project.ProjectStart = Null.

Scope показывает значение для Project.ProjectStart = Null

Что я проверил:

  • Убедитесь, что все проекты построены на x86 и что проект, который я использую, - x86. Однако у меня 64-битная машина Win7. Может ли это быть проблемой x86 и x64 dll?

Это тупица. Я куплю тебе Mountain Dew, если ты поможешь мне ;)

ОТВЕТ НАЙДЕН!!!

Это решение применимо ко всем аналогичным проблемам Microsoft.Office.Interop во всех офисных приложениях.

Вот тема, которую я начал в MSDN, которая нашла мой ответ. http://social.msdn.microsoft.com/Forums/office/en-US/079ed850-b8ee-4d5f-93ad-a31f6d9c2607/microsoftofficeinteropmsproject-throwing-systemnotimplementedexception?forum=officegeneral#079ed850-b8ee-4d5f-93ad-a31f6d9c2607

Вы пытались использовать технологию позднего связывания (см. Type.InvokeMember) для получения значения? Это помогает? ДА! есть и ответ. Type.InvokeMember работает.

Вот фрагмент кода, который я сейчас использую для доступа к этим членам.

    public DateTime LateBindProjectStart()
    {
        try
        {
            if (project != null)
            {
                if (project is Microsoft.Office.Interop.MSProject.Project)
                {
                    DateTime dtStart = (DateTime)(typeof(Microsoft.Office.Interop.MSProject.Project).InvokeMember(
                        "ProjectStart",
                        BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                        null,
                        project,
                        null));
                    return dtStart;
                }
                else
                    return DateTime.MinValue;
            }
            else
                return DateTime.MinValue;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

person John Kocktoasten    schedule 30.07.2014    source источник
comment
Изучая некоторые хорошие вещи, пока я копаюсь в этом. Код в этом примере запускается из фонового рабочего потока. Backgroundworker — это многопоточная квартира, название stackoverflow.com/questions/4685237/, а объекты COM-взаимодействия - это однопоточные апартаменты. msdn.microsoft.com/en-us/library /8sesy69e(v=vs.100).aspx Так что это может оказать некоторое влияние. Это происходит на моем четырехъядерном компьютере, поэтому может быть проблема с потоками.   -  person John Kocktoasten    schedule 01.08.2014
comment
Другая возможность заключается в том, что когда я смотрю на mspData.Project.ProjectStart в окне просмотра, он показывает, что это динамический {system.DateTime}, поэтому там тоже есть что исследовать. Веселье продолжается!   -  person John Kocktoasten    schedule 01.08.2014
comment
Что такое объект mspData? Можете ли вы получить какие-либо другие свойства localProject?   -  person Rachel Hettinger    schedule 05.08.2014