.NET sees wrong methods on COM object

-1

I am finding that the methods exposed by an instance of __ComObject don't match what I expect.

Background

Here is an example that works as expected:

var type = Type.GetTypeFromProgID("Excel.Application");
foreach ( var member in type.GetMembers() )
{
    Console.WriteLine(m.Name);
}

If you run this, you'll get a list of the properties and methods exposed by Excel.Application, such as

ActivateMicrosoftApp
ActiveCell
ActiveChart
ActiveDialog
ActiveEncryptionSession
//Etc... there are about 100 methods and properties

In addition, you would find that all of these methods can be invoked using InvokeMember:

var instance = Activator.CreateInstance(type, null);
type.InvokeMember
(
    name: "Exit",
    invokeAttr: BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMember,
    binder: null,
    target: instance,
    args: new [] {}
);

The above will cause Excel to exit, for example.

The problem

Here's the issue. I have a custom COM component (contained in a third party .exe) where the properties and methods do not match what is expected, nor do they match what is shown in Object Browser. Instead, I get back these:

ToString
GetLifetimeService
InitializeLifetimeService
CreateObjRef
Equals
GetHashCode
GetType

These look like the properties and methods that belong to a MarshalByReferenceObject. But that isn't what I need.

In addition, if I attempt to invoke any of the known methods using InvokeMember, I get this error:

Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))`).

The question: What are these methods? Where is my proper ComObject? How do I call the actual methods that belong to the COM component?

Note: If I generate an interop assembly using TlbImp.exe, I get a .NET proxy class that contains all the proper properties and methods, and I can invoke them and they work.

Note also: I used this solution to obtain the type's name (it is correct). Since the code in the example worked, it also demonstrates that the COM component does indeed expose IDispatch.

c#
.net
reflection
com
asked on Stack Overflow Apr 4, 2019 by John Wu • edited Apr 4, 2019 by John Wu

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0