Word Automation from C# vs. VB.NET
I recently received a question about doing some Word automation using .NET, and I saw an interesting little difference between the C# and VB.NET calling into the Interop Assembly for certain properties/methods...
If I take VBA or VB6 code that works, and convert it to the almost identical VB.NET code ... (after adding a reference to Word in my VB.NET project);
Dim wordApp As New Word.Application()
Dim newDoc As Word.Document = wordApp.Documents.Add
newDoc.Range.Text = "Test"
newDoc.AttachedTemplate = "C:\....\Macmillan.dot"
wordApp.Visible = True
It works fine, but in C# I get an error setting the AttachedTemplate property;
error CS1545: Property, indexer, or event 'AttachedTemplate' is not supported by the language; try directly calling accessor methods 'Word._Document.get_AttachedTemplate()' or 'Word._Document.set_AttachedTemplate(ref object)'
object missing = System.Reflection.Missing.Value;
Word.ApplicationClass wordApp = new Word.ApplicationClass();
Word.Document newDoc = wordApp.Documents.Add(ref missing, ref missing, ref missing, ref missing);
newDoc.Range(ref missing,ref missing).Text = "Test";
newDoc.AttachedTemplate = @"C:\....\Macmillan.dot";
wordApp.Visible = true;
I was able to make it work by writing the code like this;
object missing = System.Reflection.Missing.Value;
Word.ApplicationClass wordApp = new Word.ApplicationClass();
Word.Document newDoc = wordApp.Documents.Add(ref missing, ref missing, ref missing, ref missing); newDoc.Range(ref missing,ref missing).Text = "Test";
object templateName = (object)@"C:\....\Macmillan.dot";
newDoc.set_AttachedTemplate(ref templateName);
wordApp.Visible = true;
I was interested in finding out more about this error so I asked around internally and had it explained to me quite quickly. Looking into the type-library for Word and then the IL of the Interop Assembly would have likely provided the answer as well, but I'm glad I didn't have to get into that. I'll try to pass the explanation along without mangling it too much in the translation (feel free to correct me if you can, or add additional details). Some properties of COM libraries are actually methods that support one or parameters, which is cool with VBA/VB6 as they supported this type of property as well, but they are translated (correctly it seems) by TlbImp.exe as methods (set_AttachedTemplate, get_AttachedTemplate)... VB.NET does some additional work for you so that you can still code against these property/methods as properties, but in C# you have to use them as methods. Interesting stuff, and likely a bit of a gotcha for people trying to move VBA code into .NET.
[Listening to: In the Air Tonight - Phil Collins - Miami Vice (05:29)]
Comments
- Anonymous
May 13, 2003
Duncan:
Just wrote a white paper on this for the Visual Studio Tools for Office group. (That is, it outlines all the issues I could find when coding against the Word and Excel PIAs using C#--and there were quite a few.) I'll be happy to forward my draft to you if you'd like. Should be up on MSDN RSN. -- Ken - Anonymous
May 13, 2003
Also, I'd be a little leery of this:
newDoc.Range(ref missing,ref missing).Text = "Test";
I originally wrote the code that way, but one of the team members reviewing my code suggested that this is a bad idea, since both parameters are passed by reference, and the internal code could modify the parameter value of one parameter before using the second, thereby causing weird side effects. Of course, that's totally unlikely to happen, but why risk it? I rewrote all my examples to pass two separate parameters in cases like this (or 15 separate parameters, in cases that required that many <g>) -- Ken - Anonymous
November 02, 2003
Is this the only way?
Isn't there a direct access method to properties in c#?
Reply to micke@arkpen.se - Anonymous
January 05, 2004
sdfsds - Anonymous
January 05, 2004
dsfs - Anonymous
March 08, 2004
Hi:
I have a quick question in regard of applying a locked template. It seems that after I applied the locked template, all the styles and formatting fields are still unlocked. Is there anyway I can lock thos fields based on the locked template? - Anonymous
April 28, 2004
The comment has been removed - Anonymous
July 01, 2004
how do i insert a text in my header/footer in my template - Anonymous
July 12, 2004
COM object with CLSID {000209FF-0000-0000-C000-000000000046} is either not valid or not registered.
I keep getting this error.Does anybody know why
Thanks in advance - Anonymous
August 18, 2004
This helped a lot, and I never thought of the problem Range(ref missing, ref missing) exposed. Thanks.