7

I have an instance of a COM object... which is created like this:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application");
Object application = Activator.CreateInstance(type);

When I try to invoke a method:

type.GetMethod("RefreshAll").Invoke(application, null);

-> type.GetMethod("RefreshAll") returns null. When I try to get all the methods with type.GetMethods(), there is only these methods:

  1. GetLifetimeService
  2. InitializeLifetimeService
  3. CreateObjRef
  4. ToString
  5. Equals
  6. GetHashCode
  7. GetType

Where is the RefreshAll Method? And how can I invoke it?

2 Answers 2

13

You can't use GetMethod on COM objects, you have to use a different way:

this.application.GetType().InvokeMember("RefreshAll", BindingFlags.InvokeMethod, null, this.application, null);

I am using this way in a old project that uses COM so it should work ok for you.

Sign up to request clarification or add additional context in comments.

3 Comments

Though a fine answer at the time, c# 4 makes it much easier to perform COM-interop via the dynamic keyword below
Attention, coming from using dynamic in my tool github.com/awaescher/RepoZ I discovered heavy memory leaks with it. I switched to the answer from Nathan W to fix that! See more here: stackoverflow.com/questions/33080252/…
See the other comments on MickyD's answer on how to deal with the issue ...
5

I realise this is a late answer but c# 4 changes things a bit with the introduction of the dynamic keyword which was designed with COM-interop in mind.

MSDN:

The COM interop scenario that the C# team specifically targeted in the C# 4 release was programming against Microsoft Office applications, such as Word and Excel. The intent was to make this task as easy and natural in C# as it always was in Visual Basic. [1]

Your code now becomes:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application");
dynamic application = Activator.CreateInstance(type);
application.RefreshAll(); // <---- new in c# 4

Now you won't see RefreshAll() in Visual Studio statement completion so don't be alarmed. It will compile.

[1] Understanding the Dynamic Keyword in C# 4

9 Comments

Attention, coming from using dynamic in my tool github.com/awaescher/RepoZ I discovered heavy memory leaks with it. I switched to the answer from Nathan W to fix that! See more here: stackoverflow.com/questions/33080252/…
@Waescher odd considering MS made it for COM in the first place. I suspect you are just not releasing things properly which has nothing to do with dynamic
@Waescher ooh I just did some googling and it appears you are correct. Nasty little dynamic. Good find
Thanks for the correction. That link I posted (stackoverflow.com/questions/33080252/…) shows exactly the problem I face as well, with all the RuntimeBinder stuff. And don't get that wrong, that leak is huge: i.imgur.com/5ucIcI6.png. I might add that I call that method containing the dynamic quite often but anyways ...
@Waescher No, thank-you. I guess I wasn't noticing it in my stuff as the apps don't run for very long then exit. Hopefully MS will rectify. :)
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.