2

在创建使用 .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).
    

mcc 编译器在代码枚举中没有检测到“MyAssembly”存在,但是这里有一个函数会编译成功:


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

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

谢谢!

问候,铁

4

1 回答 1

2

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

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

我的案例示例:

mcc -B csharedlib:MyLib MyFunction -a OpenMode

...或一般来说:

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

我已经用构建脚本自动化了这个。这是迄今为止唯一有效的解决方案。

于 2010-10-29T22:12:25.253 回答