Компилятор mcc «Ошибка Depfun» при сборке dll с .NET-зависимостями и перечислениями, инкапсулирующими данные - PullRequest
2 голосов
/ 28 октября 2010

Я столкнулся с проблемами в MATLAB R2010b при создании DLL, использующей интеграцию .NET и перечисления с инкапсулированными данными.

Пример:

  1. В MATLAB используется сборка .NET, назовем ее «MyAssembly» (MyAssembly.dll).
  2. Есть Matlab перечисления класса "OpenMode"

    <code>
    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" Таким образом, чтобы получить доступ к .NET-перечислению через Matlab-перечисление (в моем случае это необходимо для типов приведения):
    <code>
    netElem = OpenMode.ReadOnly.Net;
    cls = class(netElem)
    cls = 
        MyAssembly.OpenMode
    
  3. Функция Matlab, которая должна быть экспортирована:

    <code>
    function retVal = MyFunction(inputs)
        NET.addAssembly('MyAssembly.dll');
        flag = OpenMode.ReadOnly;
        netFlag = flag.Net;
        % Some code...
    end
    
  4. Добавление сборки .NET в Matlab (проверка)
    <code>
    NET.addAssembly('MyAssembly.dll')
    
  5. Попробуйте скомпилировать Dll:
    <code>
    mcc -B csharedlib:MyLib MyFunction
    
    ... и получите ошибку:
    <code>
    Depfun error: 'Undefined variable "MyAssembly" or class "MyAssembly.OpenMode.ReadOnly".' 
    ??? Error using ==> mcc
    Error executing mcc, return status = 1 (0x1).
    

Компилятор mcc не обнаруживает в перечислении кода, что «MyAssembly» существует, но вот функция будет успешно скомпилирована:

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

Если вы столкнулись с похожими проблемами в MATLAB и нашли решение, пожалуйста, скажите мне, что делать.

Спасибо!

С уважением, iroln

1 Ответ

2 голосов
/ 30 октября 2010

Кажется, я нашел решение этих проблем.Это не очень элегантно, но работает.

Компилятор mcc имеет опцию " -a filename ".Эта опция позволяет вам добавить указанные файлы в архив CTF.Вы хотите добавить все файлы, которые определяют перечисление, используя сборки .NET:

Пример для моего случая:

mcc -B csharedlib:MyLib MyFunction -a OpenMode

... или вообще:

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

Я автоматизировал это с помощью build-скрипта.Это пока единственное решение, которое работает.

...