te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>TypeInitia​lizationEx​ception, BadImageFormatException using a .net assembly created in MatLab 2019b 64bit - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

TypeInitia​lizationEx​ception, BadImageFormatException using a .net assembly created in MatLab 2019b 64bit - Stack Overflow

programmeradmin3浏览0评论

I need to create a .NET assembly from a Matlab 2019b 64bit script and use it in .NET 4.8 application wrote in Visual Studio 2022 64bit . The script is pretty simple:

function [SNR, PhaseNoise] = Measure_SNR_w_SBX(FullName, FigurePath)
close all
%%Do something with data in file FullName, calculate SNR, PhaseNoise and
%%create a file FigurePath img
end

I created the assembly trough this command:

mcc -W 'dotnet:myAssembly,myClass' -T link:lib Measure_SNR_w_SBX.m

resulting in an assemply exposing, among others, this method:

public MWArray[] Measure_SNR_w_SBX(int numArgsOut, MWArray FullName, MWArray FigurePath)
{
    return mcr.EvaluateFunction(numArgsOut, "Measure_SNR_w_SBX", FullName, FigurePath);
}

The final usage will be an application where I cannot use MWArray or other Matlab types but I'm restricted to standard type (double, strings) so I defined a wrapper assemlby (.NET 4.8) that uses standard types parameters:

public void Measure_SNR_w_SBX(in string FullName, in string FigurePath, out double SNR, out double PhaseNoiseMean)
{   
    MWCharArray mwFullName = new MWCharArray(FullName);
    MWCharArray mwFigurePath = new MWCharArray(FigurePath);
    
    MWNumericArray output = obj.Measure_SNR_w_SBX(2, mwFullName, mwFigurePath);
    
    SNR = output[0].ToScalarDouble();
    PhaseNoiseMean = output[1].ToScalarDouble();
}

Inside the wrapper I instantiate the Matlab produced assembly trough this:

using myAssembly;
using MathWorks.MATLAB.NET.Arrays;
[....]
obj = new myAssembly.myClass();

But when myClass is istantiated what I got is:

System.TypeInitializationException: 'The type initializer for 'myAssembly.myClass' threw an exception.'

which in turn collect three internal exceptions:

TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.
TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Arrays.MWArray' threw an exception.
BadImageFormatException: Attempt to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Of course myAssembly, mwArray and wrapper assemblies are referenced into the application. Matlab runtime is installed and the Array assembly is placed here:

C:\Program Files\MATLAB\MATLAB Runtime\v97\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll

Also excluding the wrapper assembly and instantiating myAssembly directly into the application lead to the same result. And if I change the call order i.e.:

MWCharArray fullName = new MWCharArray(txtDatFile.Text);
MWCharArray figure_path = new MWCharArray(txtFigureFile.Text);
var obj = new myAssembly.myClass();
output output = obj.Measure_SNR_w_SBX(2, fullName, figurePath);
double snr = output[0].ToScalarDouble();
double phase_noise = output[1].ToScalarDouble();

The exception is thrown on the first line:

MWCharArray fullName = new MWCharArray(txtDatFile.Text);

i.e.:

System.TypeInitializationException: 'The type initializer of 'MathWorks.MATLAB.NET.Arrays.MWArray' threw an exception.'

that's collecting:

BadImageFormatException: Attempt to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.

How can I fix this?

I need to create a .NET assembly from a Matlab 2019b 64bit script and use it in .NET 4.8 application wrote in Visual Studio 2022 64bit . The script is pretty simple:

function [SNR, PhaseNoise] = Measure_SNR_w_SBX(FullName, FigurePath)
close all
%%Do something with data in file FullName, calculate SNR, PhaseNoise and
%%create a file FigurePath img
end

I created the assembly trough this command:

mcc -W 'dotnet:myAssembly,myClass' -T link:lib Measure_SNR_w_SBX.m

resulting in an assemply exposing, among others, this method:

public MWArray[] Measure_SNR_w_SBX(int numArgsOut, MWArray FullName, MWArray FigurePath)
{
    return mcr.EvaluateFunction(numArgsOut, "Measure_SNR_w_SBX", FullName, FigurePath);
}

The final usage will be an application where I cannot use MWArray or other Matlab types but I'm restricted to standard type (double, strings) so I defined a wrapper assemlby (.NET 4.8) that uses standard types parameters:

public void Measure_SNR_w_SBX(in string FullName, in string FigurePath, out double SNR, out double PhaseNoiseMean)
{   
    MWCharArray mwFullName = new MWCharArray(FullName);
    MWCharArray mwFigurePath = new MWCharArray(FigurePath);
    
    MWNumericArray output = obj.Measure_SNR_w_SBX(2, mwFullName, mwFigurePath);
    
    SNR = output[0].ToScalarDouble();
    PhaseNoiseMean = output[1].ToScalarDouble();
}

Inside the wrapper I instantiate the Matlab produced assembly trough this:

using myAssembly;
using MathWorks.MATLAB.NET.Arrays;
[....]
obj = new myAssembly.myClass();

But when myClass is istantiated what I got is:

System.TypeInitializationException: 'The type initializer for 'myAssembly.myClass' threw an exception.'

which in turn collect three internal exceptions:

TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.
TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Arrays.MWArray' threw an exception.
BadImageFormatException: Attempt to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Of course myAssembly, mwArray and wrapper assemblies are referenced into the application. Matlab runtime is installed and the Array assembly is placed here:

C:\Program Files\MATLAB\MATLAB Runtime\v97\toolbox\dotnetbuilder\bin\win64\v4.0\MWArray.dll

Also excluding the wrapper assembly and instantiating myAssembly directly into the application lead to the same result. And if I change the call order i.e.:

MWCharArray fullName = new MWCharArray(txtDatFile.Text);
MWCharArray figure_path = new MWCharArray(txtFigureFile.Text);
var obj = new myAssembly.myClass();
output output = obj.Measure_SNR_w_SBX(2, fullName, figurePath);
double snr = output[0].ToScalarDouble();
double phase_noise = output[1].ToScalarDouble();

The exception is thrown on the first line:

MWCharArray fullName = new MWCharArray(txtDatFile.Text);

i.e.:

System.TypeInitializationException: 'The type initializer of 'MathWorks.MATLAB.NET.Arrays.MWArray' threw an exception.'

that's collecting:

BadImageFormatException: Attempt to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
TypeInitializationException: The type initializer of 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.

How can I fix this?

Share Improve this question edited Feb 17 at 14:16 weirdgyn asked Feb 17 at 14:15 weirdgynweirdgyn 9781 gold badge20 silver badges52 bronze badges 1
  • I also tried to specify the framework 4.8 in mcc line.. nothing changes. – weirdgyn Commented Feb 17 at 14:52
Add a comment  | 

1 Answer 1

Reset to default 0

I found the problem:

the bitness of the application is forced to 32bit even if the AnyCPU model is applied if this checkbox is checked (it translate to Perfer 32bit)

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论