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

Posted

技术标签:

【中文标题】使用 .NET 依赖项和封装数据的枚举构建 dll 时,mcc 编译器“Depfun 错误”【英文标题】:The mcc compiler "Depfun error" when building dll with .NET-dependencies and Enumerations That Encapsulate Data 【发布时间】:2010-10-28 19:17:21 【问题描述】:

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

例子:

    有一个在 MATLAB 中使用的 .NET 程序集,我们称之为“MyAssembly”(MyAssembly.dll)。

    有 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
    

    应该导出的 Matlab 函数:

    
    function retVal = MyFunction(inputs)
        NET.addAssembly('MyAssembly.dll');
        flag = OpenMode.ReadOnly;
        netFlag = flag.Net;
        % Some code...
    end
    
    在 Matlab 中添加 .NET 程序集(检查)
    
    NET.addAssembly('MyAssembly.dll')
    
    尝试编译 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 中遇到过类似问题并找到了解决方案,请告诉我该怎么做。

谢谢!

问候, 铁

【问题讨论】:

【参考方案1】:

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

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

我的例子:

mcc -B csharedlib:MyLib MyFunction -a OpenMode

...或一般来说:

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

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

【讨论】:

以上是关于使用 .NET 依赖项和封装数据的枚举构建 dll 时,mcc 编译器“Depfun 错误”的主要内容,如果未能解决你的问题,请参考以下文章

JNA:本机库依赖项和JAR提取

使用本地、纱线工作区依赖项和生产环境(例如 App Engine)环境变量构建?

如何在gradle构建文件中将哪个依赖项和依赖项版本打包到war文件中?

未复制到输出目录的引用的依赖关系

如何使用包含在其类依赖注入中的 .net 5 类库的 dll?

部署 .exe 和依赖的 .dll