【问题标题】:Using MATLAB MWArray.dll in C# Class Library在 C# 类库中使用 MATLAB MWArray.dll
【发布时间】:2016-11-16 04:11:27
【问题描述】:

我正在尝试在 C# 类库中使用 .dll,在 MATLAB 中使用 Matlab .net Complier 构建,但是每次初始化 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# .net arrays matlab class-library


【解决方案1】:

帮助我的是确保 C# 应用程序和 matlab 模块在相同的架构下 - 意思是 32 位或 64 位。

如果您的 Matlab 是 64 位 - 尝试将 C# 项目更改为 64 位

看到这个帖子: Creating a shared library (.NET Assembly) in Matlab and using it in C#

【讨论】:

    【解决方案2】:

    我正在解决同样的问题,就我而言,它似乎是 .csproj 文件中的某些内容,听起来很奇怪。

    一般来说,我建议尝试以下方法: 创建一个新的 Windows 窗体应用程序并添加随附的代码。不要忘记添加对 MWArray.dll 的引用。 运行代码,如果抛出异常,则说明 Matlab 运行时存在安装问题,或者运行时的 x86 / x64 版本与构建的应用程序不匹配。 (您表示您已经这样做了,但这是一个旨在帮助他人的一般答案)

    将随附的代码添加到应用程序的 program.cs 中,看看它是否会引发异常。 继续向抛出异常的 DLL 前进,直到抛出异常。

    当最终抛出异常时,验证项目的 x86 / x64 是否与 Matlab 运行时的匹配。

    如果 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)
    {
    
    }
    

    【讨论】:

    • 我目前正在处理同样的问题,只是想知道,我如何检查 matlab 运行时版本是否匹配?
    【解决方案3】:

    所以这神奇地开始在 Windows 服务器上发生,在该服务器上数周内没有任何更改。

    对我来说,在挖出我的眼睛之后,解决方案是将网站应用程序池中的“启用 32 位应用程序”设置为 FALSE。一旦我这样做了,一切正常,我将眼球放回眼窝。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多