我使用MATLAB .Net Builder生成了一个.Net库。我设法在C#中没有任何问题地使用它,但我现在尝试使用我在F#Interactive中创建的快速F#包装器进行一些测试。
问题是,我似乎无法在F#Interactive中使用MWArray
类。
我设法使用#r
命令引用DLL,但在MathWorks
命令后使用intellisense时找不到open
域。
此外,如果我运行我的代码,当流遇到MWArray
时,我会收到以下错误:
将会话绑定到'C:\ Program Files \ mypath \ bin \ Debug \ MWArray.dll'...
接着是
错误FS0193:内部错误:无法加载文件或程序集'file:/// C:\ Program Files \ mypath \ bin \ Debug \ MWArray.dll'或其依赖项之一。尝试加载格式不正确的程序。 System.IO.FileNotFoundException:无法加载文件或程序集“MWArray,Version = 2.11.0.0,Culture = neutral,PublicKeyToken = e1d84a0da19db86f”或其依赖项之一。该系统找不到指定的文件。 文件名:'MWArray,Version = 2.11.0.0,Culture = neutral,PublicKeyToken = e1d84a0da19db86f' (...)at。$ FSI_0009.main @()in C:\ Program Files \ mypath \ ScriptTest.fsx:第49行
警告:装配绑定日志记录已关闭。 要启用程序集绑定失败日志记录,请将注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)设置为1。 注意:程序集绑定失败日志记录会导致一些性能损失。 要关闭此功能,请删除注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog]。
因错误而停止
我真的不知道它来自何处以及如何解决问题。
有没有人成功使用F#的MATLAB .Net库?
你有建议帮我解决问题吗?
答案 0 :(得分:2)
我不熟悉MatLab和.NET互操作,但你检查了架构吗?换句话说,请确保您没有尝试将64位DLL加载到32位进程中,反之亦然。此外,如果要加载对本机程序集进行P / Invoke调用的托管程序集,则该本机DLL应位于运行当前FSI会话的目录中。您可以通过CurrentDirectory
类的System.Environment
属性检查并设置此值。
答案 1 :(得分:0)
我不确定F#-interactive,但我设法制作了一个非常基本的F#3.0控制台应用程序,该应用程序使用MWArray.dll和matlab函数,我用matlab NE构建器编译...
open makesquare
open MathWorks.MATLAB.NET.Arrays
[<assembly: MathWorks.MATLAB.NET.Utility.MWMCROption("-nojit")>]
do()
[<EntryPoint>]
let main argv =
let stuff = new MLTestClass()
let numArray = new MWNumericArray(5)
let res = stuff.makesquare(1, numArray)
let res_val = res.GetValue(0)
printfn "%A" res_val
System.Console.ReadKey()
0 // return an integer exit code
makesquare函数,只是本教程中的简单函数 http://www.mathworks.se/help/dotnetbuilder/ug/create-a-net-component-from-matlab-code.html
对于C#中使用.net 4. +的类似解决方案: use .net 2.0 dll in .net 4.5 project (vshost crashes on debug)