使用.NET依赖项和封装数据的枚举构建dll时,mcc编译器“Depfun error”

时间:2010-10-28 19:17:21

标签: matlab mcc matlab-compiler

在创建使用.NET集成的DLL和封装数据的枚举时,我在MATLAB R2010b中遇到了问题。

示例:

  1. 在MATLAB中有一个.NET程序集,我们称之为“MyAssembly”(MyAssembly.dll)。
  2. 有Matlab枚举类“OpenMode”

    
    classdef OpenMode
        methods
            function obj = OpenMode(netType)
                obj.Net = netType;
            end
        end
        properties
            Net
        end
        enumeration
            ReadOnly  (MyAssembly.OpenMode.ReadOnly)
            ReadWrite (MyAssembly.OpenMode.ReadWrite)
        end
    end
    
    该类使用.NET枚举:“MyAssembly.OpenMode” 以这种方式通过Matlab枚举访问.NET枚举(在我的情况下,对于强制转换类型是必要的):
    
    netElem = OpenMode.ReadOnly.Net;
    cls = class(netElem)
    cls = 
        MyAssembly.OpenMode
    

  3. 应该导出的Matlab函数:

    
    function retVal = MyFunction(inputs)
        NET.addAssembly('MyAssembly.dll');
        flag = OpenMode.ReadOnly;
        netFlag = flag.Net;
        % Some code...
    end
    

  4. 在Matlab中添加.NET程序集(检查)
    
    NET.addAssembly('MyAssembly.dll')
    
  5. 尝试编译Dll:
    
    mcc -B csharedlib:MyLib MyFunction
    
    ...并得到错误:
    
    Depfun error: 'Undefined variable "MyAssembly" or class "MyAssembly.OpenMode.ReadOnly".' 
    ??? Error using ==> mcc
    Error executing mcc, return status = 1 (0x1).
    
  6. mcc编译器在代码枚举中没有检测到“MyAssembly”存在,但是这里有一个函数将被成功编译:

    
        function retVal = MyFunction(inputs)
            netflag = MyAssembly.OpenMode.ReadOnly;
            % Some code...
        end
    

    如果您在MATLAB中遇到类似问题并找到解决方案,请告诉我该怎么做。

    谢谢!

    此致 iroln

1 个答案:

答案 0 :(得分:2)

我似乎找到了解决这些问题的方法。它不是很优雅,但它有效。

mcc编译器具有“ -a filename ”选项。此选项使您可以为CTF存档添加指定的文件。您希望使用.NET程序集添加定义枚举的所有文件:

我的案例:

mcc -B csharedlib:MyLib MyFunction -a OpenMode

......或者一般来说:

mcc -B csharedlib:MyLib MyFunction -a projectdir/*.m

我已使用构建脚本自动执行此操作。 到目前为止,这是唯一有效的解决方案。