在C#类库中使用MATLAB MWArray.dll
本文关键字:MATLAB MWArray dll 类库 | 更新日期: 2023-09-27 18:00:50
我正试图在C#类库中使用在MATLAB和MATLAB.net Complier中构建的.dll,但每次初始化MWArray.dll中的对象时,程序都会抛出异常,例如:
MWNumericArray m = new MWNumericArra(10,10);
例外:
System.TypeInitializationException was caught
HResult=-2146233036
Message=The type initializer for 'MathWorks.MATLAB.NET.Arrays.MWNumericArray' threw an exception.
Source=MWArray
TypeName=MathWorks.MATLAB.NET.Arrays.MWNumericArray
StackTrace:
at MathWorks.MATLAB.NET.Arrays.MWNumericArray.op_Implicit(Double[] values)
at VolCalc.Vol.CalculateVolatility(Double[] data)
InnerException: System.TypeInitializationException
HResult=-2146233036
Message=The type initializer for 'MathWorks.MATLAB.NET.Arrays.MWIndexArray' threw an exception.
Source=MWArray
TypeName=MathWorks.MATLAB.NET.Arrays.MWIndexArray
StackTrace:
at MathWorks.MATLAB.NET.Arrays.MWIndexArray..ctor()
at MathWorks.MATLAB.NET.Arrays.MWNumericArray..ctor(Double scalar)
at MathWorks.MATLAB.NET.Arrays.MWNumericArray.get__Inf()
at MathWorks.MATLAB.NET.Arrays.MWNumericArray..cctor()
InnerException: System.Security.SecurityException
HResult=-2146233078
Message=Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
Source=MWArray
StackTrace:
at MathWorks.MATLAB.NET.Utility.MWSafeHandle..ctor()
at MathWorks.MATLAB.NET.Arrays.MWArray..ctor()
at MathWorks.MATLAB.NET.Arrays.MWIndexArray..ctor()
at MathWorks.MATLAB.NET.Arrays.MWNumericArray..ctor(MWArrayComponent arrayComponent, Int32 rows, Int32 columns)
at MathWorks.MATLAB.NET.Arrays.MWIndexArray..cctor()
InnerException:
我试着在控制台应用程序中这样做,效果很好,但我需要使用matlab中内置的.dll的.dll。
有什么想法吗?
帮助我的是确保C#应用程序和matlab模块处于相同的架构下,即32或64位。
如果你的Matlab是64位的-试着将C#项目更改为64位
请参阅以下帖子:在Matlab中创建共享库(.NET Assembly(并在C#中使用
我正在处理同样的问题,在我的情况下,它似乎是.csproj文件中的某个东西,听起来很奇怪。
一般来说,我建议尝试以下方法:创建一个新的Windows窗体应用程序并添加附带的代码。不要忘记添加对MWArray.dll的引用。运行代码,如果引发异常,则说明Matlab运行时存在安装问题,或者运行时的x86/x64版本与构建的应用程序不匹配。(你表示你已经这样做了,但这是一个旨在帮助他人的一般答案(
将随附的代码添加到应用程序的program.cs中,看看它是否引发异常。继续向引发异常的DLL前进,直到引发异常为止。
当最终引发异常时,请验证项目的x86/x64是否与Matlab运行时的x86/x64匹配。
如果x86/x64版本匹配,请使用其他类名创建一个新的DLL项目,该项目的构造函数与失败的DLL具有相同的签名。将附带的代码添加到新的DLL中,解开失败的DLL并连接到此新DLL中,然后运行应用程序。如果代码没有引发异常,那么.csproj文件或其他DLL可能有问题。将失败DLL中的代码块复制并粘贴到新的DLL中,然后重新测试异常。继续,直到复制完所有代码或返回异常为止。如果返回异常,请继续进行故障排除以查找有问题的代码行。如果所有代码都被复制了,那么你就有了一个正常工作的DLL。你应该能够从那里得到它,以摆脱失败的DLL,并用新的功能DLL替换它。
我希望这能有所帮助!Zack
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
try
{
MWNumericArray oMW = new MWNumericArray();
}
catch (Exception ex)
{
}
因此,这神奇地开始发生在Windows服务器上,在该服务器上数周没有任何更改。
在我大开眼界之后,我的解决方案是将网站应用程序池中的"启用32位应用程序"设置为FALSE。一旦我做到了,一切都正常了,我把我的眼球放回了眼眶。