Подтвердить что ты не робот

Встраивается ли PIA в .NET 4.0 beta 2?

Некоторое время назад я написал несколько примеров взаимодействия Word в бета-версии Visual Studio 1 и установил ссылку на Microsoft.Office.Interop.Word, которая будет внедрена (установите "Вставить типы Interop" = true в ссылочных свойствах). Они отлично работали, и я не запускал их некоторое время... до сегодняшнего дня.

Конечно, теперь я работаю под бета-версиями как Visual Studio 2010, так и .NET 4.0 - и, похоже, он несколько сломан.

Вот код, о котором идет речь (просто код-код):

using Microsoft.Office.Interop.Word;

class WordImprovement1
{
    static void Main()
    {
        Application app = new Application { Visible = true };
        app.Documents.Add();
        Document doc = app.ActiveDocument;            
        Paragraph para = doc.Paragraphs.Add();
        para.Range.Text = "Thank goodness for C# 4";

        object filename = "demo.doc";
        object format = WdSaveFormat.wdFormatDocument97;
        doc.SaveAs(FileName: ref filename, FileFormat: ref format);
        doc.Close();
        app.Quit();
    }
}

Здесь исключение, которое я получаю большую часть времени, когда "Вставить типы Interop" установлено в "true" или я связываюсь с "/l" в командной строке:

System.MissingMethodException: Method not found:
'Void Microsoft.Office.Interop.Word._Application.set_Visible(Boolean)'.
   at WordImprovement1.Main()

Очень редко, это работает, что еще более странно.

Если я устанавливаю "Вставить типы Interop" в "false" (или используйте /r в командной строке вместо /l ), все работает нормально.

Если я удалю свойство "Видимый = истинный" свойство setter, он тоже работает... но я знаю, что это свойство... оно даже предлагается IntelliSense!

Пока я не выполнял исчерпывающее тестирование на нескольких ящиках, я могу подтвердить, что мой нетбук (работающий под управлением Windows 7 вместо Vista, но все же .NET 4.0 beta 2) видит ту же проблему.

Любые предложения относительно того, что это я сломал или .NET 4.0 beta 2?

4b9b3361

Ответ 1

Отличная добыча! Это похоже на ошибку в генерации кода для индексированных свойств (не известная, поэтому спасибо за сообщение об этом!) Я пробовал последнюю внутреннюю сборку VS 2010, и она также воспроизводится.

Случается, что если вы используете инициализатор объекта, генерируется следующий код:

Application <>g__initLocal19 = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000209FF-0000-0000-C000-000000000046")));
<>g__initLocal19.set_Visible(true);

Однако, если вы установите Visible = true в отдельном заявлении (без инициализатора объекта), тогда выдается следующий код:

Application application = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000209FF-0000-0000-C000-000000000046")));
application.Visible = true;

PIA определяет только нижний, поэтому он не работает, когда вы используете инициализатор объекта. Обходной путь на данный момент состоит в том, чтобы установить Visible в отдельный оператор, который должен работать нормально.

Я зарегистрировал ошибку об этом. Еще раз спасибо!