Я пытаюсь использовать файл dll, созданный из Matlab с помощью dotnetbuilder (http://www.mathworks.se/help/dotnetbuilder/ug/create-a-net-component-from-matlab-code.html) ..

Чтобы использовать dll, мне нужно добавить ссылку на dll matlab под названием 'MWArray.dll' ( http://www.mathworks.se/help/dotnetbuilder/ug/integrate-your-net-component-in-ac-application.html ), и, к сожалению, эта dll, похоже, доступна только для .net 2.0.

Единственный способ заставить простое консольное приложение работать с dll, созданной мною из Matlab, - это сделать следующее:

  • нацелите dll на .net 2.0 при ее создании в Matlab с помощью dotnetbuilder.
  • изменить версию .net, используемую в моем консольном приложении, на версию 2.0

Если я этого не сделаю, консольное приложение завершит работу vshost.exe, когда я попытаюсь запустить проект.

Я хочу иметь возможность использовать функции .net 4. +, поэтому настройка проекта для использования .net 2.0 неприемлема .. И когда я получу это простое консольное приложение, работающее по крайней мере с .net 4.0, я попытаюсь получить его также работает в приложении F # 3.0.

Моя программа выглядит так:

...
using MathWorks.MATLAB.NET.Arrays;
using makesquare;

namespace Matlabski
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var stuff = new makesquare.MLTestClass();
                var res = stuff.makesquare(1, 3);
                Console.WriteLine(res[0]);
                Console.WriteLine("sdfsdf");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }
    }
}

И я попытался отредактировать файл app.config, чтобы иметь возможность обрабатывать как .net 2, так и 4:

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
    <supportedRuntime version="v2.0"/>
  </startup>
</configuration>

Но не работает ..

Можно ли настроить проект так, чтобы я мог использовать как .net 2.0, так и 4.5, и будет ли это работать в моем проекте? или мне нужно сделать что-то еще, чтобы использовать эту надоедливую DLL 2.0 ..?

Я использую:

  • VS2013
  • MATLAB R2013b (64 бит)
2
Michelrandahl 28 Фев 2014 в 20:08
Почему все-таки вылетает всхост? Вы прикрепили отладчик и видели, что это за исключение? Это может быть очень просто исправить
 – 
JaredPar
28 Фев 2014 в 22:38

1 ответ

Лучший ответ

Решил проблему!

Я скомпилировал свою функцию Matlab, нацеленную на .net 4 ..., а затем добавил

[assembly: MathWorks.MATLAB.NET.Utility.MWMCROption("-nojit")] 

К коду ..

Полученный код выглядит так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathWorks.MATLAB.NET.Arrays;
using makesquare;
[assembly: MathWorks.MATLAB.NET.Utility.MWMCROption("-nojit")] 

namespace Matlabski
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MLTestClass stuff = new MLTestClass();
                object[] res = stuff.makesquare(1, 3);
                Console.WriteLine(res[0].ToString());
                Console.WriteLine("sdfsdf");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }
    }
}

App.config выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

Однако app.config, похоже, не нужен ...

3
Michelrandahl 28 Фев 2014 в 23:08
Большое Вам спасибо. Я долго боролся с этой проблемой и в итоге создал отдельный проект для .NET 2.0, в котором использовался WMArray. Как вы узнали об этом специальном варианте сборки -nojit?
 – 
Mariusz
12 Авг 2016 в 16:37