Why does (MLApp.MLApp)Marshal.GetActiveObject("MATLAB.Desktop.Application") return NULL?
7 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
MathWorks Support Team
il 4 Set 2018
Risposto: MathWorks Support Team
il 18 Set 2018
I am attempting to create a COM connection to a running MATLAB instance from a .NET assembly with the code:
class Program
{
static void Main(string[] args)
{
//Variable
Type matlab;
object[] parameter = new object[1];
object mlObject;
try
{
matlab = Type.GetTypeFromProgID("Matlab.Application");
mlObject = Activator.CreateInstance(matlab);
object[] command = { "matlabroot" };
object testResult = (object)matlab.InvokeMember("Execute", System.Reflection.BindingFlags.InvokeMethod, null, mlObject, command);
....
On some machines this works with any MATLAB version I try it with, where as on others it will not work at all. In these cases, the function simply returns "NULL". This is resolved by using the MATLAB command "regmatlabserver", at which point it will work for any MATLAB instance. I would like to avoid this, as this command requires Admin rights.
Risposta accettata
MathWorks Support Team
il 4 Set 2018
A couple of notes to make because we are connecting to an active session.
First, if the C# application has any references to MATLAB, for example R2017b, that MATAB should be registered. For GetActiveObject to work, MATLAB should be started as an automation server. Because we are connecting specifically to "matlab.desktop.application" we need to use "enableservice" to make it an Automation Server. In the MATLAB Desktop instance, enter the command:
>> enableservice('AutomationServer',true);
This command will set the existing MATLAB into an automation Server (Does not require admin). At this point, the code should work on all machines. More information can be found at:
Another alternative is the use the "matlab.applicaiton" progid (If your application does not require the full MATLAB desktop). This will connect it to any MATLAB started with the "-automation" flag. For example, open a windows CMD terminal and type:
>> matlab -automation
To open a MATLAB command window as an automation server.
A final suggestion is to create a new instance if C# fails to get an existing instance, as shown at:
0 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Write COM Applications to Work with MATLAB in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!