C# &引用;无效被调用方“;在C中使用MLapp时#
我在使用函数时遇到了一个奇怪的问题。我注意到,当我执行以下操作时,此功能正常工作:C# &引用;无效被调用方“;在C中使用MLapp时#,c#,matlab,com,com-interop,matlab-deployment,C#,Matlab,Com,Com Interop,Matlab Deployment,我在使用函数时遇到了一个奇怪的问题。我注意到,当我执行以下操作时,此功能正常工作: matlab = new MLApp.MLAppClass(); object myObject; matlab.GetWorkspaceData("myVariable", "base", out myObject); 但是如果我尝试使用同一个对象作为输出,我会得到一个“Invalid Callee”异常。此外,这也会产生相同的错误: matlab = new MLApp.MLAppClass(); o
matlab = new MLApp.MLAppClass();
object myObject;
matlab.GetWorkspaceData("myVariable", "base", out myObject);
但是如果我尝试使用同一个对象作为输出,我会得到一个“Invalid Callee”异常。此外,这也会产生相同的错误:
matlab = new MLApp.MLAppClass();
object myObject = new object();
matlab.GetWorkspaceData("myVariable", "base", out myObject);
这是非常麻烦的,因为我需要从Matlab到VisualStudio获取大量数据,而且我实际上无法创建52K个未初始化的变量并保持它们不变。有什么方法可以“取消初始化”变量吗?这里是否缺少一些概念?如注释中所述,如果要重用out
变量,应首先将其设置为null
下面是一个经过测试的示例:
您可以为
GetWorkspaceData
方法创建包装,如下一个示例所示:
public object GetData(string name)
{
object data;
mlApp.GetWorkspaceData(name, "base", out data);
return data;
}
或者更有用的通用包装器:
public T GetData<T>(string name)
{
object data;
mlApp.GetWorkspaceData(name, "base", out data);
if (data == null)
return default(T);
if (data is T)
return (T)data;
else
throw new InvalidCastException($"The variable '{name}', of type '{data.GetType().Name}' cannot be casted to type '{typeof(T).Name}'.");
}
public T GetData(字符串名称)
{
对象数据;
mlApp.GetWorkspaceData(名称,“基本”,输出数据);
如果(数据==null)
返回默认值(T);
如果(数据为T)
返回(T)数据;
其他的
抛出新的InvalidCastException($“类型为“{data.GetType().name}”的变量“{name}”不能强制转换为类型“{typeof(T.name}”);
}
解决方案是将输出对象设置为null
我找到了。您可以设置
myObject=null代码>垃圾收集器应该在某个时候完成剩下的工作。Wonko,这似乎真的很有效。但我还是不知道到底发生了什么。为什么我不能指定一个“新”变量?为什么它必须是未初始化的?当您通过COM包装调用Mathlab时,它可能和进程上不能改变其他内容或类似内容有关。
public object GetData(string name)
{
object data;
mlApp.GetWorkspaceData(name, "base", out data);
return data;
}
public T GetData<T>(string name)
{
object data;
mlApp.GetWorkspaceData(name, "base", out data);
if (data == null)
return default(T);
if (data is T)
return (T)data;
else
throw new InvalidCastException($"The variable '{name}', of type '{data.GetType().Name}' cannot be casted to type '{typeof(T).Name}'.");
}