使用 .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 错误”的主要内容,如果未能解决你的问题,请参考以下文章
使用本地、纱线工作区依赖项和生产环境(例如 App Engine)环境变量构建?
如何在gradle构建文件中将哪个依赖项和依赖项版本打包到war文件中?