在C#类库中使用MATLAB MWArray.dll

时间:2014-04-30 09:39:26

标签: c# .net arrays matlab class-library

我试图在 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。

有什么想法吗?

3 个答案:

答案 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 。一旦我这样做了,一切正常,我将眼球放回插座。