5

我对 ILNUmerics 非常感兴趣,并想尝试免费版本,但我遇到了麻烦。

我从一个控制台应用程序开始,并试图运行“hello ilnumerics”控制台应用程序,但我注意到 VS 无法找到 MKL 库。

我在 Windwos 8 下使用 VS2012(通过 2010 年中期 MacBook Pro 上的 Bootcamp;是否相关);我已经从 Project 解决方案安装了 NuGet Packages 扩展。然后右键单击解决方案资源管理器中的引用,“管理 Nu Get 包”,从在线/搜索找到各种版本的数字。我选择了“ILNumerics”并安装。我的项目中添加了“ILNumerics”和“ILNumerics.Native”。然后我可以在解决方案资源管理器的“参考”下看到 ILNumerics,还可以得到两个新文件夹 /bin32/ 和 /bin64/,它们都包含两个名为 libiomp5md.dll 和 mkl_custom.dll 的 DLL。我检查了他们的“复制到输出目录”属性,它们都设置为“如果更新则复制”。

显然 mkl_custom 没有找到。我编写了以下代码,取自快速入门指南:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ILNumerics;

namespace ConsoleApplication3
{

  class Program  : ILMath
{
    static void Main(string[] args)
    {

        ILArray<double> A = array<double>
            (new double[] { 1,1,1,1,1,2,3,4,1,3,6,10,1,4,10,20} ,4, 4);
        ILArray<double> B = counter(4, 2);

        ILArray<double> Result = linsolve(A, B);
        Console.Out.WriteLine("A: " + Environment.NewLine +
                A.ToString());

            Console.Out.WriteLine("B: " + Environment.NewLine + B.ToString());

            Console.ReadKey();
        }
    }
}

我得到了这个异常: ILNumerics.dll 中发生了“System.DllNotFoundException”类型的未处理异常

附加信息:无法加载 DLL 'mkl_custom':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)

如果我不调用 linsolve,则 ILArray 的 ToString 方法确实有效:如果我评论 // ILArray Result = linsolve(A, B);

我在屏幕上打印了两个矩阵。

我还尝试计算矩阵的行列式并得到相同的异常:显然任何时候我调用 mkl_custom VS 都无法找到它。

请问有什么帮助/提示吗?

此外,是否有必要通过 NuGet 在添加到解决方案的任何项目上安装 ILNumerics?是否可以在本地安装一次,然后在必要时添加参考?

4

3 回答 3

3

两种选择:

1) 确保所有二进制文件都可以按预期访问:ILNumerics 使用 AnyCPU 目标并通过在启动时将“bin32”/“bin64”目录添加到 PATH 环境变量来选择平台相关子文件夹。您的机器上可能出现故障?您可以通过手动将正确的二进制文件(取决于您的平台)直接放入输出路径来确保。

2) 如果错误仍然存​​在:mkl_custom.dll 依赖于其他一些 dll 本身。一个 (libiomp5md.dll) 与 ILNumerics nuget 包一起提供。其他应该存在于您的系统上:KERNEL32.DLL 和 MSVCR110.DLL。确保,你有这些!如果缺少内核 dll -> 称之为奇迹并重新安装您的系统。如果缺少 msvcr110 -> 转到此处并安装“Visual C++ Redistributable for Visual Studio 2012”。

如果问题仍然存在,您可以在 ILNumerics bugtracker 上提交错误,因为运行时应该在那里,正如您所写的那样,您使用的是 VS2012。可能这是一个版本控制问题。

编辑:由于版本 4.0 ILNumerics 不再在 bin32/bin64/ 子文件夹中部署本机二进制文件,而是将系统范​​围内的所有本机依赖项安装到 GAC 和 System32/WOW 文件夹中。不过,旧方案仍然有效(为了与旧项目兼容)。但是不再需要明确处理 ILNumerics 的任何依赖关系。它们应该只是在运行时找到。

于 2013-07-16T14:45:19.613 回答
0

Like numbers303 said, ILNumerics.dll can't find a required dependency. You can brute force fixing this dependency by copying the required DLLs to the same directory as the ILNumerics.dll as a post build step, but I think there's a more elegant solution.

A VS2010 .NET console solution gets created by default with the x86 configuration. Compiling and running the ILNumerics example Hello ILNumerics! code with this configuration results in a DLL not found exception (mkl_custom.dll).

Re-targeting the solution via configuration manager to 'Any CPU' fixed the issue for me: In Solution Explorer, right click on the solution and select properties. Select Configuration Properties and click on the Configuration Manager... button in the upper right hand corner. Make sure that the project that uses ILNumerics has the 'Any CPU' selected. If 'Any CPU' isn't available as a selection, select '' from the pulldown and create an 'Any CPU' platform based on your current platform. Usually this just means accepting the default in the 'New Project Platform' dialog. You'll probably also want to modify the 'Active solution platform:' to contain an 'Any CPU' target as well.

Rebuild/run.

于 2013-10-03T17:48:15.753 回答
0

就我而言,它有助于安装“Visual C++ Redistributable for Visual Studio 2012”,尽管我使用 Visual Studio 2010 并安装了相应的“Visual C++ Redistributable for Visual Studio 2010”。只要不需要 mkl_custom.dll,它就可以正常工作。但是我的同事在没有安装 2012 Redistributable 的情况下没有这个问题。

于 2014-01-25T10:23:25.823 回答