Обновление: Это подтвержденная ошибка в бета-версии Silverlight 4. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523052Итерация над полями Word с использованием ComAutomationFactory в Silverlight 4
Я решил эту проблему, переключившись на полномасштабное приложение WPF и используя обычный старый Microsoft.Office.Interop.Word. Но мне все еще очень интересно, как заставить это работать, используя динамические значения из ComAutomationFactory.
Это может быть больше вопросов C# 4.0, но я пытаюсь использовать класс ComAutomationFactory в доверенном приложении SL4 для загрузки документа Word, изменения текста и его печати.
Используя регулярные окна приложения, это довольно легко:
Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true;
Object oFalse = false;
Application oWord = new Application();
Document oWordDoc = new Document();
oWord.Visible = false;
object oTemplatePath = "C:\\Users\\jwest\\Desktop\\DocumentTemplate.dotx";
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
foreach (Field myMergeField in oWordDoc.Fields)
Однако в SL4 вы должны использовать динамический ключевое слово. Он отлично работает, пока я пытаюсь перебирать мои поля:
Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true;
Object oFalse = false;
dynamic oWord = ComAutomationFactory.CreateObject("Word.Application");
oWord.Visible = false;
object oTemplatePath = "C:\\Users\\jwest\\Desktop\\DocumentTemplate.dotx";
dynamic oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
dynamic fields = oWordDoc.Fields;
foreach (var myMergeField in fields)
В этом случае я получаю сообщение об ошибке выполнения, говоря, что я не могу неявно преобразовать ComAutomationMetaObjectProvider в IEnumerable. Независимо от того, что я делаю, любые свойства, связанные с моим объектом Word com, имеют тип ComAutomationMetaObjectProvider, и я не могу их перебирать.
Было упомянуто, что я должен попытаться получить поле в виде строки из члена.
for (int i = 0; i < oWordDoc.Fields.Count; i++)
{
String field = oWordDoc.Fields.Item[i].Result.Text;
}
Это приводит к интересным исключением: HRESULT: 0x800A16E6, который когда Googled, не вызывает абсолютно ничего.
Я не знаю ответ на ваш вопрос, но просто хотел бы отметить, что в C# 4, вы не должны» t нужны параметры 'ref oMissing'. – CoderDennis