我试图在 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:
我尝试在Console App中执行此操作,并且工作正常,但我需要.dll使用.lab内置的.dll。
有什么想法吗?
答案 0 :(得分:4)
帮助我的是确保C#应用程序和matlab模块在相同的架构下 - 意思是32位或64位。
如果您的Matlab是64位 - 请尝试将C#项目更改为64位
看这篇文章: Creating a shared library (.NET Assembly) in Matlab and using it in C#
答案 1 :(得分:3)
我正在解决同样的问题,在我看来,它似乎是.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。
我希望这有帮助! 扎克
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
try
{
MWNumericArray oMW = new MWNumericArray();
}
catch (Exception ex)
{
}
答案 2 :(得分:0)
所以这神奇地开始发生在Windows服务器上,几周内服务器上没有任何变化。
对我来说,解决之后的解决方案是设置"启用32位应用程序"将网站应用程序池中的设置设置为 FALSE 。一旦我这样做了,一切正常,我将眼球放回插座。