Fail to get IRhinoApplication from COM Object in Rhino 6


#1

Hello,
I have a tool that I am migrating from Rhino 5x64 to Rhino 6. My Rhino 5x64 tool uses IRhinoApplication as follows:

Type type = Type.GetTypeFromProgID("Rhino5x64.Application");
dynamic rhino = Activator.CreateInstance(type);
IRhino5x64Application RhinoApp = rhino as IRhino5x64Application;

This is the code I am using for Rhino 6 COM is:

Type type = Type.GetTypeFromProgID("Rhino.Application.6");
dynamic rhino = Activator.CreateInstance(type);
IRhinoApplication RhinoApp = rhino as IRhinoApplication;

Activator.CreateInstance returns a COM object. However, casting the “rhino” as IRhinoApplication (Rhino 6) returns null.

If I try to do a something like:

IRhinoApplication RhinoApp = rhino;

Then I get:

{“Unable to cast COM object of type ‘System.__ComObject’ to interface type ‘Rhino.IRhinoApplication’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘{9837542C-DC30-4EBE-BA30-B6EBDF471508}’ failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).”}

What is the recommended set up for Rhino 6?

Any help is appreciated!
-Nate


#2

UPDATE: So after some trial and error, it appears I can simply use the dynamic type directly for everything I need (and not attempt to cast it as IRhinoApplication)

For example, this appears to work…

Type type = Type.GetTypeFromProgID(“Rhino.Application.6”);
dynamic rhino = Activator.CreateInstance(type);
rhino.Visible = 1;

Still interesting that this differs from the Rhino5x64 setup.

-Nate


(Dale Fugier) #3

Hi @archinate1,

This from one of our developer samples:

dynamic rhino = null;
try
{
  string rhinoId = "Rhino.Application";
  System.Type type = System.Type.GetTypeFromProgID(rhinoId);
  rhino = System.Activator.CreateInstance(type);
}
catch
{
}

if (null == rhino)
{
  Console.WriteLine("Failed to create Rhino application");
  return;
}

Note, starting with Rhino 6, Rhino.Application will always retrieve the current version of Rhino (e.g. 6, 7, 8, etc.). To get a specific version, then append the major version number to the end (e.g. Rhino.Application.6).

– Dale


(Tyler Kvochick) #4

Is there a way to get find which members are exposed through COM in this way? The .Visible property isn’t defined on Rhino.RhinoApp in the API docs and while .RunScript() and .GetPluginObject() work, other methods do not.

Thanks!


(Dale Fugier) #5

Hi @tyler.kvochick,

Keep in mind that Com != .NET. Thus, you will not find a Rhino.RhinoApp object in COM, for example.

But if you want intellisense and autocomplete on the Rhino or RhinoScript COM objects, then add a reference to the type libraries. These articles should help.

https://docs.microsoft.com/en-us/dotnet/framework/interop/how-to-add-references-to-type-libraries
https://docs.microsoft.com/en-us/dotnet/framework/interop/importing-a-type-library-as-an-assembly
https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/set-reference-to-a-type-library

– Dale


(Tyler Kvochick) #6

Awesome, thank you!