Referencing a com addin from a .net application via ole automation

L

Luke

Hi

I'm developing a c# application integrated with excel via ole automation.
I've developed an excel commandbar and handle buttons' click events. So far,
so good.

I got stuck with accessing my com addin from the .net application. I
couldn't find any official documentation, so following a vb example that I
found on the web, I'm passing the addin instance:

class Connect : Object, Excensibility.IDTExcensibility2
{
....
public void OnConnection(object application, Extensibility.ext_ConnectMode
connectMode, object addInInst, ref System.Array custom)
{
addInInst.GetType().InvokeMember("Object",
BindingFlags.Public | BindingFlags.SetProperty, null, addInInst, new
object [] {this});
}
....
}

According to the example I should be able to the addin from my application:

foreach(Office.ComAddIn comAddin in xlApp.COMAddIns)
{
if (comAddIn.ProgId.Equals("ComAddin.Connect"))
{
ComAddin.Connect com = (ComAddin.Connect)
comAddIn.GetType().InvokeMember("Object", BindingFlags.Public |
BindingFlags.GetProperty, null, comAddIn, null);
}
}

However I get an exception saying that the 'Specified cast is not valid'.
Is there some other way to access my com addin?

Cheers,
Luke
 
D

DM Unseen

Luke,

you have a .NET c# app that launces/connects to Excel through (OLE)
Automation, and now want to launch a comm addin as well through the
..NET app?

The Excel.Applicatiob object has COmmaddins collection:

VB example:

Dim MyXLApp as Excel.Application
'.... connect to XL instance

'activates Registered COM addin:

MyXLApp.Commaddins("MyComProgID").Connect = True

Dm unseen
 
L

Luke

Hi

DM Unseen said:
you have a .NET c# app that launces/connects to Excel through (OLE)
Automation, and now want to launch a comm addin as well through the
..NET app?

No, my addin is loaded when excel starts. What I'm trying to do is to cast a
COMAddIn object retrieved from Excel.Application.COMAddIns collection to my
add-in type for further use.

As an example, here's the code from my .net app:

object myComAddIn = comAddIn.GetType().InvokeMember("Object",
BindingFlags.Public | BindingFlags.GetProperty,
null, comAddIn, null);

myComAddIn.GetType().InvokeMember("Test",
BindingFlags.Public | BindingFlags.InvokeMethod,
null, myComAddIn, null);

The above code successfully invokes the Test() method of my COM AddIn. What
I'm trying to do next is to cast myComAddIn to my com add-in type, which
fails.

The reason is to be able to subscribe to add-in's custom events. Any ideas?

Luke
 
D

DM Unseen

Got it,

No, i'm not sure if that is possible. I'f i might hazzard a guess:

You first need to register the typelib of the COM addin and and then
create an interop assembly for .NET and reference this in your .NET
project. Else your project does not know which events are sourced by
the COMM addin.

Then create a variable of your top level object with events (I do not
know the .NET equivalent) and assign the CoMaddin Object property to
it.

DM Unseen
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top