Не нарушено ли встраивание PIA в.NET 4.0 beta 2?
Некоторое время назад я написал несколько примеров взаимодействия Word в Visual Studio beta 1 и установил ссылку на Microsoft.Office.Interop.Word
для встраивания (установите в свойствах ссылки "Embed Interop Types" = true). Они работали нормально, и я не запускал их некоторое время... до сегодняшнего дня.
Конечно, сейчас я работаю в бета-версии 2 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();
}
}
Вот исключение, которое я получаю большую часть времени, когда для "Embed Interop Types" установлено значение "true" или я связываю с "/ l" в командной строке:
System.MissingMethodException: Method not found:
'Void Microsoft.Office.Interop.Word._Application.set_Visible(Boolean)'.
at WordImprovement1.Main()
Очень редко это работает - что еще более странно.
Если для "Embed Interop Type" установить "false" (или использовать / r в командной строке вместо / l), все будет работать нормально.
Если я удаляю установщик свойства "Visible = true", он тоже работает... но я знаю, что это свойство есть... его даже предлагает IntelliSense!
Хотя я еще не провел исчерпывающее тестирование на нескольких устройствах, я могу подтвердить, что мой нетбук (работающий под управлением Windows 7 вместо Vista, но все еще.NET 4.0 beta 2) сталкивается с той же проблемой.
Любые предложения относительно того, что это я сломался или.NET 4.0 beta 2?
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 в отдельном утверждении, которое должно работать нормально.
Я зарегистрировал ошибку об этом. Еще раз спасибо!