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}'.");
}